웹서버/엔진엑스

Nginx https 적용하기.(openssl 인증서 발급)(ubuntu 18.04 LTS)(let's encrypt)

삐뚤어진 개발자 2020. 1. 21.

Nginx https 적용하기.(openssl 인증서 발급)(ubuntu 18.04 LTS)(let's encrypt)

 

 

티스토리에 직접만든 서버 api를 적용하려고 하는데

티스토리에서 https 연결을 강제 하고 있었다. http 연결로 시도해보았지만, 막혔다.

 

nginx 웹서버에서 https를 적용하는 방법을 알아본다. 

 

 

일단 https 란?

쉽게말해 http 연결에 ssl 인증이 더해진 개념이다.

https 연결은 쉽게 말해 CA 인증서를 받아서 nginx 환경설정에 경로를 등록해줘야 사용할 수 있다.

우리가 흔히 쓰는 공인 인증서도 같은 개념이다.

 

그래서 처음에는 뭣도 모르고, 아래의 방법을 시도했다.

 

 

++ open ssl을 설치하고 시작해야한다.

 

 

 

1. 이 블로그를 보고, root ca생성/ ssl을 발급 받았다.

 

OpenSSL 로 ROOT CA 생성 및 SSL 인증서 발급

웹서비스에 https 를 적용할 경우 SSL 인증서를 VeriSign 이나 Thawte, GeoTrust 등에서 인증서를 발급받아야 하지만 비용이 발생하므로 실제 운영 서버가 아니면 발급 받는데 부담이 될 수 있다.

www.lesstif.com

ssl 이란?

인증서는 개인키 소유자의 공개키에 인증기관의 개인키로 전자서명한 데이타다.

모든 인증서는 발급기관(CA) 이 있어야 하나 최상위에 있는 인증기관(root ca)은 서명해줄 상위 인증기관이 없다.

root ca의 개인키로 스스로의 인증서에 서명하여 최상위 인증서를 만든다.

이렇게 스스로 서명한 ROOT CA 인증서를 Self Signed Certificate 라고 부른다.

IE, FireFox, Chrome 등의 Web Browser 제작사는 VeriSign 이나 comodo 같은 유명 ROOT CA 들의 인증서를 신뢰하는 CA로 미리 등록해 놓으므로 저런 기관에서 발급된 SSL 인증서를 사용해야 browser 에서는 해당 SSL 인증서를 신뢰할수 있는데

OpenSSL 로 만든 ROOT CA와 SSL 인증서는 Browser가 모르는 기관이 발급한 인증서이므로 보안 경고를 발생시킬 것이나 테스트 사용에는 지장이 없다.

 

뭐 대충 이런 설명이 되어있었는데.  인증서만 발급받으면 문제없이 https 연결이 되겠지 라고 생각하고 무작정 따라해보았다. 하지만 마지막 저 문단을 무시한 결과는 아래의 그림과 같이 크롬에서 접속이 한번에 안되는 것이었다.

 

크롬 브라우저에서 믿을 수 있는 기관을 등록해놓아서 내가 만든 최상위 인증서 (위에서 발급받은 root ca 인증서)는 보안 경고를 일으킨 것이다.

 

그래서 두번째로 무료이면서, 크롬 브라우저에 등록된 기관 인증서를 받기로 했다.

 

2. let's encrypt 라는 기관의 cerbot 이라는 것이 있다.

certbot을 설치하면 쉽게 자동으로 인증서를 발급해준다. (나중에 말하겠지만, 인증서 갱신도 쉽다.)

cerbot 홈페이지.

 

Certbot

Different Internet services are distinguished by using different TCP port numbers. Unencrypted HTTP normally uses TCP port 80, while encrypted HTTPS normally uses TCP port 443. To use certbot –webroot, certbot –apache, or certbot –nginx, you should have an

certbot.eff.org

자신의 서버 os를 선택하고 사용중인 미들웨어를 선택하면 된다.

 

나는 우분투 18.04 LTS 버전에 웹서버는 nginx를 사용중이다.

이 기준으로 설명해 보겠다.

 

 

 

 

 

 

1. 먼저 ssh 접속을 한다.

ssh 접속은 간단한 무료 툴인 putty를 사용하면 쉽다.

 

putty 설치 및 사용법

https://taewooblog.tistory.com/73

 

2. 우분투 커널에 명령어를 작성해준다.

$sudo apt-get update
$sudo apt-get install software-properties-common
$sudo add-apt-repository universe
$sudo add-apt-repository ppa:certbot/certbot
$sudo apt-get update

Certbot PPA를 리포지토리 목록에 추가하는 작업이다. 

참고로 apt-get update 오류가 나서 골치가 좀 썩었었다.

 

 

 

 

 

 

 

3. certbot을 설치해준다.

$sudo apt-get install certbot python-certbot-nginx

 

4. 이제 인증서를 발급 받아야 하는데, 그전에 도메인이 있어야 한다. (나는 무료 도메인을 발급받았다. 무료 도메인 및 자세한 사항은 다음 포스팅에서 다루겠다.)

server {

    listen       443 ssl default_server;
    listen [::]:443 ssl default_server;
    server_name goo.ringobee.kro.kr


    location / {
        root /var/www;
        autoindex on;
        autoindex_exact_size off;
}

 

참고로 let's encrypt 인증서는 80과 433 포트밖에 안되니 포트설정 잘해놓으시길.. (보통 http는 80번 https는 443번 포트를 사용한다.)

 

 

5. 어찌됐든 server_name 을 자신의 도메인으로 설정해주고, 우분투 커널에 아래의 명령을 넣어서 인증서를 설치한다.

sudo certbot --nginx

"인증서를 가져오려면 이 명령을 실행하고 Certbot이 Nginx 구성을 자동으로 편집하여 서비스를 제공하도록 하여 한 번에 HTTPS 액세스를 설정하십시오" 라고 설명되어있다.

 

 

*무료 도메인을 사용하여서 인증서 발급이 안되는 분들은 아래의 링크를 참고 해주세요.*

https://taewooblog.tistory.com/84

 

 

 

-- 자 이제 자신의 도메인에 https:// 로 접속을 시도해본다. (될꺼다)

 

 

6. 인증서의 유효기간이 3개월이기 때문에 3개월 안에 한번씩 갱신 해줘야 한다.

sudo certbot renew --dry-run

위의 명령어를 실행하면, 인증서가 갱신이 되는데, 3개월 마다, 서버에 접속해 갱신을 해주는 것은 너무 귀찮고 까먹을 수도 있기 때문에, 우분투에서 크론탭으로 스케줄링 해놓겠다.

 

크론탭이 뭔지? 사용법이 궁금하다면 아래의 링크를 참조하라.

https://taewooblog.tistory.com/67

 

 

나는 크론탭에 아래와 같은 명령을 저장해 놓았다. 89일 마다 인증서를 새로 갱신해주는 명령이다.

0 12 */89 * * sudo certbot renew --dry-run >> /home/tw_soul/DODO/crontab_log 2>&1

 

 

 

 

 

 

 

-- 참고로 인터넷 상황때문에 인증서를 발급받을때 애를 먹었었다. 

VPN을 연결해 놓고, 작업을 했었는데 이것 때문에 오류가 났었다.

오류가 난 문장을 구글링 해봐도 certbot에 단기간 요청을 너무 많이 해서 그렇다..는 등의 내용밖에 없었다.

 

 

 

 

이상으로 도움이 되었으면 좋겠다. 

 

 

댓글