공부하고

let's encrypt를 이용하면 SSL 인증서 발급과 갱신을 무료로 처리할 수 있습니다.




certbot 설치

cd /usr/bin
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
ln -s /usr/bin/certbot-auto /usr/bin/certbot



서버 인증 허용 설정(nginx 기준) *인증 방식이 webroot가 아니라면 건너뛰세요.

location ~ /\.(?!well-known).* {
    access_log off;
    log_not_found off;
    deny all;
}

webroot(웹 경로)를 기준으로 인증서를 발급하기에 루트 경로의 .well-known 폴더 접근이 가능해야 합니다.

service nginx reload

변경사항 반영을 위해 nginx를 재실행 합니다.




인증서 발급 - webroot 방식

certbot certonly -a webroot --webroot-path=/var/www/example.com -d example.com -d www.example.com

-a : 인증 방식 설정
--webroot-path : 웹 경로 지정
-d : 도메인(멀티 도메인 설정 가능)




인증서 발급 - DNS 방식

certbot certonly dns -d example.com --manual --preferred-challenges

DNS 라운드 로빈, HAPROXY 등을 이용할 경우에는 DNS 인증 방식을 사용할 수 있습니다.




DH 인증서 발급
openssl dhparam -out dhparam.pem 4096
발급이 완료된 인증서(dhparam.pem)는 /etc/letsencrypt/live/example.com/ 경로로 이동합니다.



서버 인증서 설정

listen      443 ssl http2;

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

ssl_dhparam /etc/letsencrypt/live/example.com/dhparam.pem;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;

ssl_stapling on;
ssl_stapling_verify on;

resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;



인증서 갱신

service nginx stop
certbot renew
service nginx start

위 커맨드를 스크립트로 만들어 cronjob에 등록하면 자동 갱신을 할 수 있습니다.