Let’s Encrypt 설치 및 SSL 인증서 발급, NGINX 설정 방법

갱신 :
by PG
Photo of author

https 프로토콜은 웹페이지에 접속하는 방문자(클라이언트)와 서버간 주고 받는 데이터를 암호화해서 보안을 올리는 방식으로 현재는 엄밀히 말하자면 SSL은 보안의 헛점이 있어서 TLS 방식을 사용하고 있습니다.

이 부분에 대해 언급하자면 불필요하게 내용이 길어지니 궁금하신 분은 검색을 통해 찾아보시고 NGINX에 SSL인증서를 연결하는 핵심 내용만 살펴보겠습니다.

튜토리얼 환경 : 우분투 16.04 LTS Xenial / NGINX / LetsEncrypt

1. Let’s Encrypt 설치

- Let's Encrypt 설치 및 SSL 인증서 발급, NGINX 설정 방법

# apt-get install letsencrypt

위 명령어를 입력해 Let’s Encrypt 및 의존성 패키지를 설치합니다.

2. Let’s Encrypt 인증서 발급

server {
listen 80;
server_name extrememanual.net www.extrememanual.net;
root /var/www/extrememanual.net;
access_log /var/www/log/extrememanual.net-access.log main;
index index.html index.htm;

location / {

}

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

현재 웹서비스를 하고 있거나, 준비를 하고 있다면 가상호스트 설정이 되어 있을텐데요. Let’s Encrypt에서 SSL 인증서를 받을때는 80포트를 이용해 해당 도메인에 연결된 웹서버가 가동되고 있는지 .well-known 디렉토리를 이용해 발급 서버와 인증 절차를 거치므로 가상호스트 설정에 위의 12-14줄을 추가합니다.

설정을 마쳤다면 NGINX를 재시작 합니다.

# letsencrypt certonly --webroot --webroot-path=/var/www/extrememanual.net -d extrememanual.net -d www.extrememanual.net

이제 인증을 위한 웹서버 설정은 끝났으니 위 명령어를 통해 도메인에 대한 인증서를 발급 받습니다. NGINX에서 설정했던 root 디렉토리는 --webroot-path와 같아야 하고 -d로 2차 도메인을 포함한 인증서를 발급 받을 수 있으니 원하는 도메인을 입력하면 되겠습니다.

만일 나중에 다른 2차 도메인을 별도로 받고 싶다면 재발급 받지 않고 NGINX에서 위처럼 2차 도메인에 대한 가상호스트를 설정한 다음 별도로 인증서를 받을 수 있습니다.

- Let's Encrypt 설치 및 SSL 인증서 발급, NGINX 설정 방법

인증서를 발급 받을때 이메일을 입력하게 됩니다. 앞서 얘기한 것처럼 Let’s Encrypt에서 발급한 인증서는 3개월짜리 이므로 만료 기간 이전에 입력한 메일로 알림을 받을 수 있습니다.

- Let's Encrypt 설치 및 SSL 인증서 발급, NGINX 설정 방법

이메일을 입력하고 Agree 버튼을 눌러 사용 약관을 넘어가면 인증서 발급이 완료됩니다. 발급 받은 인증서는 /etc/letsencrypt/live/도메인명 에 위치합니다.

openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096

인증서와 함께 디피-헬만 파라미터(이하 dhparam) 키를 만들어 인증서와 같이 설정해서 좀더 암호화 복잡도를 높이면 보안에 좋아 권장하는 방법입니다. 위 명령어를 입력해 dhparam을 만듭니다.

3. NGINX SSL 설정

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 168.126.63.1 168.126.63.2 8.8.8.8 8.8.8.4;
resolver valid=300s;
resolver_timeout 5s;

nginx.conf 파일을 열어 위 구문을 찾아 주석 처리가 되어 있다면 삭제하고 없는 부분은 추가합니다.

server {
        listen 443 ssl http2;
        server_name extrememanual.net www.extrememanual.net;
        ssl on;
        http2_max_requests 4096;

        root /var/www/ssl-extrememanual.net;
        access_log /var/www/log/ssl-extrememanual.net-access.log main;
        index index.html index.htm;

        add_header Strict-Transport-Security "max-age=15552000; includeSubdomains" always;
        add_header X-Frame-Options SAMEORIGIN;
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";

        ssl_certificate /etc/letsencrypt/live/extrememanual.net/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/extrememanual.net/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/extrememanual.net/chain.pem;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;

        location / {

        }
}

가상호스트 설정의 80포트 아래에 위 설정을 본인의 웹서버에 맞게 설정합니다. 중요한 점은 보안을 위해 헤더를 추가하고 발급 받은 SSL 인증서를 설정하는 것입니다.

설정을 마친 다음 NGINX를 재시작, 도메인의 https 프로토콜로 접속해서 인증서가 잘 작동하는지 확인하면 되겠습니다.

4. Let’s Encrypt 자동 갱신

# letsencrypt renew

재발급 명령어는 위와 같습니다. 여러 도메인을 발급 받았을 경우 그 날짜를 맞추기 쉽지 않기 때문에 crontab을 이용해 위 명령어를 주기적으로 실행해 재발급 가능 기간이 되면 갱신이 되도록 설정합니다. (참고로 갱신이 가능한 시점은 만료 30일 전입니다.)

# crontab -e
 1. /bin/ed
 2. /bin/nano <---- easiest
 3. /usr/bin/vim.basic
 4. /usr/bin/vim.tiny

위 명령어를 입력하면 crontab을 편집할 에디터를 선택할 수 있는데 편한걸로 선택합니다.

0 6 * * 1 /usr/bin/letsencrypt renew >> /var/log/letsencrypt-renew.log
5 6 * * 1 /usr/sbin/service nginx reload

편집창의 주석 아래 위처럼 갱신 명령어 실행과 함께 결과값을 로그로 남기고 5분 후 NGINX를 재시작하게 설정합니다. 필자는 웹서버가 가장 널널한 6시에 맞춰놨습니다.

5. 도메인 추가

- Let's Encrypt 설치 및 SSL 인증서 발급, NGINX 설정 방법

위에서도 언급했지만 루트도메인에 대한 인증서를 발급 받았는데 나중에 2차 도메인을 인증 받으려면 가상 호스트를 별도로 지정해서 따로 받아 운영할 수 있습니다. 꼭 하나의 인증서에 도메인이 포함되어야 하는건 아니니까 부담없이 추가하면 되겠습니다.

재발급 명령어 입력시 현재 발급 받았던 모든 도메인에 대한 갱신을 시도하고 날짜가 만료일 30일 이전이면 자동 갱신됩니다.

Leave a Comment