SSL 인증서 발급 및 HTTPS 구축

라즈베리파이 서버에 워드프레스를 HTTP로 운영중이다. 여기에 SSL 인증서를 발급받은 후에 Nginx를 설정하여 보다 보안에 안전한 HTTPS로 워드프레스를 구축하고자 한다.

우선 certbot을 이용하여 Let’s Encrypt에서 SSL 인증서를 발급받자. Let’s Encrypt는 무료로 인증서를 발급해주는 비영리 인증 기관(CA)이다. 이 발급받은 인증서를 Nginx에 적용하면 된다.

Certbot 설치 및 인증서 발급

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install certbot -y
$ sudo certbot certonly --webroot --webroot-path=/var/www/html -d happyvictor.iptime.org

eMail주소를 입력하고 몇가지 Y/N를 선택하면 인증서를 받게 된다.

SSL 인증서를 받기위한 certbot 실행 결과

성공하면 /etc/letsencrypt/live/[server name] 밑에 cert.pem, chain.pem, fullchain.pem, privkey.pem 4개의 파일이 생성된다.

Nginx 설정

위에서 받은 파일들을 nginx 에 적용을 시켜준다. 아래 443 포트 관련부분과 ssl certification 관련 부분을 설정파일에 추가해준다. nginx에서는 fullchain.pem과 privkey.pem 두개의 파일만 사용한다.

        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;
        ...
        ...
        ssl_certificate      /etc/letsencrypt/live/happyvictor.iptime.org/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/happyvictor.iptime.org/privkey.pem;
        ssl_ciphers  HIGH:!aNULL:!MD5;
$ sudo nano /etc/nginx/sites-available/default

SSL이 포함된 서버 블럭은 다음과 같다.

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        # SSL configuration
        #
        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;
        #
        # Note: You should disable gzip for SSL traffic.
        # See: https://bugs.debian.org/773332
        #
        # Read up on ssl_ciphers to ensure a secure configuration.
        # See: https://bugs.debian.org/765782
        #
        # Self signed certs generated by the ssl-cert package
        # Don't use them in a production server!
        #
        # include snippets/snakeoil.conf;

        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.php index.nginx-debian.html;

        server_name happyvictor.iptime.org;

        ssl_certificate      /etc/letsencrypt/live/happyvictor.iptime.org/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/happyvictor.iptime.org/privkey.pem;
        ssl_ciphers  HIGH:!aNULL:!MD5;
}

수정을 했으면 저장하고 나온 후 nginx 서비스를 다시 시작해준다. 이후 발급받은 인증서를 다시 확인하고 443포트가 LISTEN 상태인지 확인한다. 웹이 재대로 동작을 하는지 확인하기 위해서 http://happyvictor.iptime.org, https://happyvictor.iptime.org 두 주소로 다 접속해본다.

# nginx 재시작
$ sudo systemctl restart nginx

# 발급받은 인증서 확인
$ sudo certbot certificates

# 443포트가 LISTEN 상태인지 확인
$ netstat -ant
발급받은 인증서 확인
443포트가 LISTEN 상태인지 확인

이젠 좀 더 안전한 HTTPS 웹사이트를 운용할 수 있다. 그렇지만 한가지 알아둘 것은 Let’s Encrypt를 사용하게 되면 인증서 유효 기간이 90일 이라는 것이다. 따라서 만료가 되기 전에 갱신을 해줘야 한다. 인증서를 자동으로 갱신하도록 하는 것은 여기 글을 참조하여 설정하자.

참조

Leave a Comment