오드로이드로 개인서버 구축하기 #4 Let's Encrypt 무료 SSL 인증서로 https 설정하기

Explanation

우분투에 Let's Encrypt 무료 SSL 인증서로 https 설정하기
저는 https://www.wsgvet.com/bbs/board.php?bo_table=web&wr_id=179(우성군의 NAS) 글을 참고하여 적용하였고 지금 보고 계신 글은 우성군님의 글과 거의 동일한 이야기를 개인적으로 정리한 글입니다. 우성군님의 글이 정말 보기 좋게 정리되어 있어서 이글을 참고하는 것보다 위 링크를 참고하는 것도 좋은 방법일 것 같습니다.

1. Let's Encrypt 설치

$ apt-get install letsencrypt

2. Nginx 설정 수정

$ vi /etc/nginx/sites-available/cheolguso
# cheolguso 부분은 원하시는 이름으로 생성, 기존의 설정을 수정합니다.

# 새로 추가된 설정이라면
$ ln -s /etc/nginx/sites-available/cheolguso /etc/nginx/sites-enabled/
# 위와 같이 심볼링크를 등록해줍니다.

대략 아래와 같은 설정에 root 부분을 확인하고, 아래 표시한 location ~ ... 부분을 추가합니다.

server {
    listen 80;
    server_name cheolguso.com;

    root /home/cheolguso
    index index.php index.html;

    # 추가한 부분 ---
    location ~ /.well-known {
        allow all;
    }
    # ---
    ...
}

3. 인증서 발급받기

$ letsencrypt certonly -a webroot -w /home/cheolguso -d cheolguso.com -d www.cheolguso.com

/home/cheolguso 부분은 위 nginx 설정의 root 부분이며, -d cheolguso.com 처럼 -d 를 통해 더 많은 도메인을 등록할 수 있습니다.
한번 등록된 인증서에는 도메인을 추가하거나 수정할 수 없고 새로 발급 받아야 합니다.

발급 커맨드 명령어를 입력하면 이메일을 입력하고 동의하면 발급 됩니다.

4. Dhparams 파일 생성

$ mkdir /etc/nginx/ssl
# 디렉토리 생성
$ cd /etc/nginx/ssl
# 생성한 디렉토리로 이동
$ openssl dhparam -out dhparams.pem
# dhparams 파일 생성

dhparams 생성에는 수 분에서 수십 분의 시간이 소요됩니다. 생성이 완료되면,

$ openssl rand 48 > session_ticket.key
# 세션 티켓키도 생성해 줍니다.

5. 본격적인 Nginx 설정 수정

요약한 cheolguso.com의 설정은 대략 아래와 같습니다.

server {
    listen 80;
    server_name cheolguso.com www.cheolguso.com;
    add_header "Cache-Control" "public, max-age=31436000";
    location / {
        rewrite ^/(.*)$ https://cheolguso.com/$1 permanent;
    }
}

server {
    listen 443 ssl;
    server_name cheolguso.com www.cheolguso.com;

    root /home/cheolguso;
    index index.php;

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    }

    ...

    location ~ /.well-known {
        allow all;
    }

    ssl_certificate /etc/letsencrypt/live/cheolguso.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/cheolguso.com/privkey.pem;

    ssl_trusted_certificate /etc/letsencrypt/live/cheolguso.com/chain.pem;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 10s;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS;

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;

    ssl_dhparam /etc/nginx/ssl/dhparams.pem;
    ssl_session_tickets on;
    ssl_session_ticket_key /etc/nginx/ssl/session_ticket.key;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
}

6. 인증서 자동 갱신

Let's Encrypt 인증서는 무료이지만 90일이라는 유효기간이 있습니다. 하지만 만기 1달전부터 갱신이 가능합니다.
갱신 명령어는 아래와 같습니다.

$ letsencrypt renew

자동 갱신을 위해서 crontab를 사용합니다.

$ crontab -e

위 명령어로 접근하여

30 2 1 1-12 * /usr/bin/letsencrypt renew >> /var/log/le-renew.log 
35 2 1 1-12 * /bin/systemctl reload nginx
# 매월 1일 새벽 2시 30분에 인증서가 갱신되며
# 매월 1일 새벽 2시 35분에 nginx를 재실행 합니다.

를 추가합니다.

간단한 설명으로 앞의 5가지 항목은 분, 시, 일, 월, 요일 입니다.
자세한 설명은 https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_%EB%B0%98%EB%B3%B5_%EC%98%88%EC%95%BD%EC%9E%91%EC%97%85_cron,_crond,_crontab를 참고 할 수 있습니다.