웹 접속 보안은 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
출처 : http://awesometic.tistory.com/19?category=964086
'오드로이드 > XU4 + Ubuntu(펌)' 카테고리의 다른 글
오드로이드 XU4 를 개인 클라우드 서버로 - 9. 무료 도메인 (0) | 2018.02.02 |
---|---|
오드로이드 XU4 를 개인 클라우드 서버로 - 8. Wordpress (0) | 2018.02.02 |
오드로이드 XU4 를 개인 클라우드 서버로 - 7. h5ai (0) | 2018.02.02 |
오드로이드 XU4 를 개인 클라우드 서버로 - 6. Nginx, PHP, MariaDB (0) | 2018.02.02 |
오드로이드 XU4 를 개인 클라우드 서버로 - 5. Plex(펌) (0) | 2018.02.02 |