본문 바로가기

정리중인 카테고리/전공 기술

우분투 서버 nginx 설치후 무료 인증서 letsencrypt 완벽 적용법 쉬운 설명

 

 

다른 설명 포스팅이나 글들은 인증서 발급 과정을 건너띄거나 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

...


끝입니다! 수고하셨습니다!