프로그래밍/서버, DBMS

[서버] NginX에서 Certbot을 통해 간단하게 SSL 발급하기

포도알77 2020. 12. 12. 15:27

NginX에서 Certbot을 통해 간단하게 SSL 발급하기

1. Certbot이란

 말 그대로 SSL certificates를 발급해주는 프로그램으로, 기존에는 https를 위하여 SSL 인증서를 구매하여야 했지만 개인용에서는 쉽고 간편하게 무료로 SSL을 발급할 수 있게 해준다.

 

 Certbot 공식 홈페이지는 certbot.eff.org이며, 이곳에서 자신의 OS와 HTTPd 프로그램 명을 선택하면 설치법부터 사용 방법까지 확인해 볼 수 있다.

 

 

2. 도메인 서버 IP에 연결하기

 당연한 얘기겠지만, 서버 IP에 도메인을 연결하여 80번 포트로 http 통신이 가능한 상태이어야 한다. 각 도메인 제공 홈페이지에서 A Record에 서버 IP를 설정하여 정상적으로 접근 가능한 상태로 만들어 두자.

 

 

3. certbot 설치 및 실행

 리눅스 기준으로 certbot을 설치해준다.

sudo apt-get install certbot

 

 설치가 완료되면 이제 인증서를 발급받을 차례이다. 인증 절차를 위해서 80번 포트를 certbot이 점유할 수 있도록 기존 웹 프레임워크나 혹은 서버 프로그램을 종료하자.

 

 그리고 나서 발급받고자 하는 도메인 주소(아래는 play.it-trip.com)를 아래와 같이 입력하면 된다.

발급 중에 뜨는 질문의 경우 잘 읽고 Y,N을 선택하면 된다.

sudo certbot certonly --standalone -d play.it-trip.com

 

4. 발급된 인증서 확인

 위 과정을 차례로 진행했다면 특별한 문제 없이 발급이 된다. 발급된 SSL은 아래의 위치에 포함된다.

sudo ls -al /etc/letsencrypt/live/play.it-trip.com/

 

만약 문제가 있었더라면 해당 path가 생성되지 않았을 것이므로 다시 시도해보자.

 

 

5. NginX에 SSL 연결하기

 NginX의 site-available에 있는 site conf에서 아래와 같이 443번 포트를 개방해주고, ssl 인증서를 넣어준다.

server {
        listen 80;
        listen [::]:80;
        
        # HTTPS를 위한 443 포트 개방
        listen 443 ssl;
        listen [::]:443 ssl;

        root /var/www/html;

        server_name play.it-trip.com;
        
        #SSL 인증서를 넣어준다.
        ssl_certificate /etc/letsencrypt/live/play.it-trip.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/play.it-trip.com/privkey.pem;

        location / {
                proxy_pass http://127.0.0.1:5555;
        }
}

 

 

6. NginX Reload 및 확인

 NginX가 정상적으로 리로딩 되었다면, https으로 페이지가 열리게 된다.

sudo service nginx reload

 

 

7. 그외 기타사항

 7.1 갱신 

 Certbot으로 받은 인증서(letsencrypt)는 3개월 유효기간이 있다. 따라서 주기에 맞추어서 갱신해 주어야 한다.

기본적으로 최신 certbot은 갱신을 위해 crontab 또는 timer로 등록되어 있다. 만약 정상적으로 갱신이 되지 않는다면, 아래의 명령어를 통해 갱신할 수 있다.

 sudo certbot renew --dry-run

 

 7.2 http redirect

 별도의 설정을 하지 않으면 사용자가 http를 여전히 사용할 수 있다. 따라서 http로 들어온 요청을 다시 https로 redirect 시켜주어야 한다. (물론 안해도 무방하다)

server {
    listen 80;
    # 80번 포트로 들어온 것을 http로 redirect
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com;
}

 

페이스북으로 공유카카오톡으로 공유카카오스토리로 공유트위터로 공유URL 복사