NAS & ODROID/Ubuntu NAS

오드로이드 XU4 를 개인 클라우드 서버로 - 10. 무료 SSL

awesometic 2017. 5. 2. 18:31
반응형

 웹 접속 보안은 SSL이 최곱니다. SSL 인증서는 보통 무료로 받기 어려운 점이 있었는데, LetsEncrypt 는 무료로 굉장히 쉽게 발급받고 갱신할 수 있도록 해줍니다. 바로 적용하러 갑시다.


 170505 h5ai에 SSL 적용 시 스트리밍에 문제가 생기네요. 첫 영상은 부드럽게 켜지는데 두 번째부턴 잘 안 되는 문제입니다. 스트리밍에 대한 SSL 설정 관련 문제인 것 같은데, 알아보고 해결책을 찾으면 업데이트하도록 하겠습니다.




1. Certbot 설치

 리눅스 패키지용 LetsEncrypt는 Certbot입니다. 저장소를 추가하고, 설치합니다.

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update && sudo apt-get install certbot


2. Nginx 설정 변경

 SSL 인증서를 얻기 위해 Nginx 설정을 변경해줘야 합니다. 인증서를 얻을 때 도메인을 적는데, Certbot에서 해당 도메인에 해당하는 서버 내 디렉토리에 특정 파일을 만들고 외부에서 접근해 봄으로써 유효한 주소인 지 판단하는 거라고 합니다. Nginx에서 적절한 설정을 넣어주지 않으면 해당 작업이 불가능하니, SSL 접속이 필요한 각 사이트 설정 파일마다 추가해줍니다. 

sudo vi /etc/nginx/sites-available/wordpress

 server 블록이 끝나기 전 아래 내용을 추가해줍니다.

location ~ /.well-known {
    allow all;
}

 참고로 이전 포스팅에서 nas 페이지 접근 제어를 위해 .htpasswd를 적용하셨던 분들은, 꼭 설정 파일에서 해당 부분 앞에 주석(#) 표시를 해주세요.

 그리고 Nginx 를 다시 로드합니다.

sudo service nginx reload


3. SSL 인증서 얻기

 Certbot을 통해 SSL 인증서를 얻기 위해선 다음 명령어가 필요합니다.

sudo certbot certonly --webroot -w {디렉토리} -d {도메인}

 해당 코드를 기반으로 수정하시면 됩니다. 디렉토리에 해당하는 도메인을 적어주셔야 합니다.

 이메일과 약관 동의를 묻고, 다 대답했다면 아래 느낌으로 완료됐다고 합니다.

awesometic@odroid:~$ sudo certbot certonly --webroot -w /var/www/html/wordpress -d blog.awesometic.kro.kr
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for blog.awesometic.kro.kr
Using the webroot path /var/www/html/wordpress for all unmatched domains.
Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0001_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0001_csr-certbot.pem

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/blog.awesometic.kro.kr/fullchain.pem. Your
   cert will expire on 2017-07-31. To obtain a new or tweaked version
   of this certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

 잘 봐둡시다.


4. Diffie-Hellman 키 생성

 더욱 좋은 보안을 위해선 해당 키를 생성해 사용하는 것이 좋다고 합니다.

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

 조금 기다리시면 /etc/ssl/certs/dhparam.pem 이란 파일이 생성됩니다.


5. SSL을 위한 Nginx 설정

5.1 강력한 SSL 설정을 위한 snippet 생성

 먼저 /etc/nginx/snippets/ssl-params.conf 를 생성해줍시다.

sudo vi /etc/nginx/snippets/ssl-params.conf

 다음 내용을 넣은 뒤 저장합니다.

# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

ssl_dhparam /etc/ssl/certs/dhparam.pem;

 그리고 SSL을 적용할 사이트에 대한 snippet을 만들어 줍시다. 

 ssl-blog.awesometic.kro.kr.conf 란 이름으로 만들겠습니다.

sudo vi /etc/nginx/snippets/ssl-blog.awesometic.kro.kr.conf

 다음 내용이 들어갑니다.

ssl_certificate /etc/letsencrypt/live/blog.awesometic.kro.kr/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/blog.awesometic.kro.kr/privkey.pem;

 blog.awesometic.kro.kr 부분에 원하는 주소를 넣으시면 됩니다.


5.2 Nginx 설정 파일 수정

 그리고 해당 웹 사이트 설정 파일을 수정해줍시다.

sudo vi /etc/nginx/sites-available/wordpress

 전 다음과 같이 되겠습니다. 여러가지 시행착오를 거친 설정 파일입니다. 수정하기 전 기존 파일 내용과 비교하면서, 참고해 수정해주세요. default_server는 안 해주셔도 됩니다. 해당 사이트가 제 Nginx에 대한 기본 사이트라는 걸 설정합니다.

server {
    # 80번 포트(일반 HTTP)로 접속 시에도 SSL인 443포트로 이동시켜 줍니다.
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name blog.awesometic.kro.kr;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    # blog.awesometic.kro.kr 부분을 자신의 도메인에 맞게 수정하세요
    include snippets/ssl-blog.awesometic.kro.kr.conf;
    include snippets/ssl-params.conf;

    root /var/www/html/wordpress;

    server_name blog.awesometic.kro.kr;

    location = /favicon.ico { log_not_found off; access_log off; }
    location = /robots.txt { log_not_found off; access_log off; allow all; }
    location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
        expires max;
        log_not_found off;
    }

	location / {
		index index.php;
        try_files $uri $uri/ /index.php$is_args$args;
	}

    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        if (!-f $document_root$fastcgi_script_name) {
            return 404;
        }
 
        fastcgi_pass unix:/run/php/php7.1-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    location ~ /.well-known {
        allow all;
    }
}

 Nginx를 다시 로드합니다.

sudo nginx reload

 SSL이 적용된 사이트로 접속한 결과입니다. 워드프레스의 경우 블로그 주소와 사이트 주소에 http:// 대신 https:// 로 바꾸어 주세요.


6. 인증서 자동 갱신

 cron을 이용해 자동으로 갱신해줄 수 있습니다. Let's Encrypt 인증서는 3개월만 유지되고, 만료 30일 이내에 갱신할 수 있습니다.

sudo crontab -e

 처음 crontab을 열었으니 무슨 에디터를 사용할 건지 묻습니다. 편한 걸로 설정해줍니다.

 그리고 아래 명령어를 넣어줍시다.

0 4 1 * * /bin/bash -l -c certbot renew --no-self-upgrade

 매월 1일 새벽 4시에 certbot renew --no-self-upgrade 명령어를 실행할 겁니다.


(옵션) SSL 보고서, 최종 등급 확인

https://www.ssllabs.com/ssltest/analyze.html?d={SSL 적용한 자신의 사이트}




 워드프레스 사이트에 대해서만 진행했는데, NAS나 다른 사이트들도 비슷하게 진행하시면 됩니다.


참고 사이트:
a. https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04
b. https://certbot.eff.org/all-instructions/
c. http://riseshia.github.io/2016/10/16/certbot-let-s-encrypt.html





전체 글 목록
2017/04/23 - [오드로이드 XU4] - 오드로이드 XU4 를 개인 클라우드 서버로 - 1. 우분투 설치
2017/04/24 - [오드로이드 XU4] - 오드로이드 XU4 를 개인 클라우드 서버로 - 2. Webmin 설치
2017/04/25 - [오드로이드 XU4] - 오드로이드 XU4 를 개인 클라우드 서버로 - 3. 외장하드 마운트
2017/04/25 - [오드로이드 XU4] - 오드로이드 XU4 를 개인 클라우드 서버로 - 4. Samba
2017/04/28 - [오드로이드 XU4] - 오드로이드 XU4 를 개인 클라우드 서버로 - 5. Plex
2017/04/30 - [오드로이드 XU4] - 오드로이드 XU4 를 개인 클라우드 서버로 - 6. Nginx, PHP, MariaDB
2017/05/02 - [오드로이드 XU4] - 오드로이드 XU4 를 개인 클라우드 서버로 - 7. h5ai
2017/05/02 - [오드로이드 XU4] - 오드로이드 XU4 를 개인 클라우드 서버로 - 8. Wordpress
2017/05/02 - [오드로이드 XU4] - 오드로이드 XU4 를 개인 클라우드 서버로 - 9. 무료 도메인
2017/05/02 - [오드로이드 XU4] - 오드로이드 XU4 를 개인 클라우드 서버로 - 10. 무료 SSL
2017/05/02 - [오드로이드 XU4] - 오드로이드 XU4 를 개인 클라우드 서버로 - IRQ Balancing
2017/05/08 - [오드로이드 XU4] - 오드로이드 XU4 를 개인 클라우드 서버로 - CPU Governor

반응형