https 프로토콜은 웹페이지에 접속하는 방문자(클라이언트)와 서버간 주고 받는 데이터를 암호화해서 보안을 올리는 방식으로 현재는 엄밀히 말하자면 SSL은 보안의 헛점이 있어서 TLS 방식을 사용하고 있습니다.
이 부분에 대해 언급하자면 불필요하게 내용이 길어지니 궁금하신 분은 검색을 통해 찾아보시고 NGINX에 SSL인증서를 연결하는 핵심 내용만 살펴보겠습니다.
목차
1. Let’s Encrypt 설치
# 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에서 발급한 인증서는 3개월짜리 이므로 만료 기간 이전에 입력한 메일로 알림을 받을 수 있습니다.
이메일을 입력하고 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. 도메인 추가
위에서도 언급했지만 루트도메인에 대한 인증서를 발급 받았는데 나중에 2차 도메인을 인증 받으려면 가상 호스트를 별도로 지정해서 따로 받아 운영할 수 있습니다. 꼭 하나의 인증서에 도메인이 포함되어야 하는건 아니니까 부담없이 추가하면 되겠습니다.
재발급 명령어 입력시 현재 발급 받았던 모든 도메인에 대한 갱신을 시도하고 날짜가 만료일 30일 이전이면 자동 갱신됩니다.