다른 설명 포스팅이나 글들은 인증서 발급 과정을 건너띄거나 nginx.conf 설정을 먼저해서 햇갈립니다.
nginx 를 설치했다는 가정하에 인증서 발급 과정부터 nginx.conf 설정 방법까지를 순서대로 설명합니다.
$ sudo apt-get install certbot letsencrypt
$ sudo certbot certonly --webroot --agree-tos --no-eff-email --email 당신@이메일 -w /var/www/letsencrypt -d www.당신도메인 -d 당신도메인
생성된 인증서는 /etc/letsencrypt/live/www.당신도메인/ 에 심볼링 링크로 생성됩니다.
이제 생성된 인증서를 nginx에 적용 시키기 위한 작업을 시작합니다.
nginx 서비스를 중지하고 인증서 challenges 용 디렉토리를 다음과 같이 생성합니다.
$ sudo mkdir -p /var/www/letsencrypt/.well-known/acme-challenge
nginx 에서 challenges 관련 설정을 따로 빼주고 ssl 관련 설정도 안 햇갈리게 따로 빼줍니다.
그전에 실행중인 nginx 서비스를 중지 시켜 주세요. 파란색 부분은 코드입니다.
$ sudo service nginx stop
$ sudo vim /etc/nginx/snippets/letsencrypt_challenges.conf
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/www/letsencrypt;
}
$ sudo vim /etc/nginx/snippets/ssl_settings.conf
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1.2;
ssl_ciphers EECDH+AESGCM:EECDH+AES;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
$ sudo vim /etc/nginx/sites-available/default
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name 당신도메인 당신도메인;
server_tokens off;
include /etc/nginx/snippets/letsencrypt_challenges.conf;
location / {
return 301 https://당신도메인$request_uri;
}
}
server {
server_name 당신도메인;
server_tokens off;
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server ipv6only=on;
ssl_certificate /etc/letsencrypt/live/당신도메인/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/당신도메인/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/당신도메인/fullchain.pem;
include /etc/nginx/snippets/ssl_settings.conf;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name 당신도메인;
ssl_certificate /etc/letsencrypt/live/당신도메인/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/당신도메인/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/당신도메인/fullchain.pem;
include /etc/nginx/snippets/ssl_settings.conf;
location / {
return 301 https://당신도메인$request_uri;
}
}
$ sudo service nginx start
모든 과정이 완료되었습니다. 만약 에러가 난다면 오타가 난겁니다.
위 모든 내용은 루트 계정 사용없이 진행되었기 때문입니다.
아, 추가로 인증서 자동 갱신을 위한 cron 을 설정합니다. 파란색은 코드입니다.
$ sudo vim /etc/letsencrypt/letsencrypt_ssl_autorenew.sh
...
systemctl reload nginx
...
$ sudo chmod +x /root/letsencrypt.sh
$ sudo crontab -e
...
20 3 * * * certbot renew --noninteractive --renew-hook /root/letsencrypt.sh
...
끝입니다! 수고하셨습니다!