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

in #ubuntu6 years ago

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

...

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