별로 이슈는 없지만, wireshark로 내용이 다 보이는 http 대신 https로 변경을 하였다.
아래 자물쇠마크가 왠지 신뢰감을 준다고나 할까
변경 방법은 https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04 를 참조하였다.
nginx기반에서 https로 웹서비스를 변경하는 법을 한글로 정리하자면
1) certbot repository 추가 후 nginxcertbot 설치
1 2 3 |
$ sudo add-apt-repository ppa:certbot/certbot $ sudo apt update $ sudo apt install -y python-certbot-nginx |
2) nginx의 default 파일에서 서버 이름 명시적으로 지정(example.com과 www.example.com을 사용한다고 하는 경우)
1 |
$ sudo nano /etc/nginx/sites-available/default |
1 |
server_name example.com www.example.com; |
3) nginx를 reload함
1 |
$ sudo systemctl reload nginx |
4) 방화벽이 있나 확인. 방화벽이 있는 경우 방화벽 조건을 Nginx Full로 변경
또한, IP 공유기 뒤에 구성된 경우 공유기의 포트 포워딩에 443 port를 추가해줘야 함.
(이게 안되면 5번 절차에서 실패가 발생)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ sudo ufw status Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6) $ sudo ufw allow 'Nginx Full' $ sudo ufw delete allow 'Nginx HTTP' |
5) certbot에 –nginx 및 -d 에 web 서비스할 host 이름을 입력한다.
1 |
$ sudo certbot --nginx -d example.com -d www.example.com |
그러면, 일단 정보를 수신할 이메일을 물어본다.
1 2 |
Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): |
다음, 약관(?) 동의를 해야한다.
1 2 3 4 5 6 7 |
------------------------------------------------------------------------------- Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree in order to register with the ACME server at https://acme-v01.api.letsencrypt.org/directory ------------------------------------------------------------------------------- (A)gree/(C)ancel: |
마지막으로, 재단에 해당 이메일 어드레스를 공개할 건지 여부를 물어본다.
나는 또다른 spam 을 양성하게 될까바 N을 선택했다.
1 2 3 4 5 6 7 |
------------------------------------------------------------------------------- Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about EFF and our work to encrypt the web, protect its users and defend digital rights. ------------------------------------------------------------------------------- (Y)es/(N)o: |
443 포트가 열리지 않으면 다음처럼 에러가 발생한다.
1 2 3 4 5 6 7 8 9 10 |
IMPORTANT NOTES: - The following errors were reported by the server: Domain: example.com Type: connection Detail: Timeout Domain: www.example.com Type: connection Detail: Timeout |
설치가 완료되면 마지막으로 http로 접속 시 https로 redirection할 것인지 여부를 물어본다.
일부러 http와 https를 따로 구동시킬 필요가 없다면 2를 선택해서, http로 접속해도 https로 redirect되도록 한다.
1 2 3 4 5 6 7 8 |
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. ------------------------------------------------------------------------------- 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. ------------------------------------------------------------------------------- Select the appropriate number [1-2] then [enter] (press 'c' to cancel): |
5) 여기까지만 해도 홈페이지에 접속해보면 https 로 접속이 된다. 하지만, 사용된 보안알고리즘이 취약하다고 하니 다음을 수행한다.
해당 명령 수행 시 시간이 조금 걸린다.
1 |
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 |
명령 수행이 끝나면 다시 default 파일을 edit한다. server 카테고리 안에 ssl_dhparam 을 추가한다.
1 |
server_name example.com www.example.com; |
server {
. . .
ssl_dhparam /etc/ssl/certs/dhparam.pem;
그리고 다시 nginx를 reload한다.
1 |
$ sudo systemctl reload nginx |
6) 이 encryption은 90일동안 유효하다고 한다. 그래서, cron을 이용해서 매일 갱신하도록 추가한다.
1 |
$ sudo crontab -e |
그러면 crontab을 수정할 editor를 물어보는데, 편한 것으로 선택하면 된다.
1 2 3 4 5 6 7 |
Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano <---- easiest 3. /usr/bin/vim.basic 4. /usr/bin/vim.tiny Choose 1-4 [2]: |
crontab의 제일 아래에 다음같이 입력하면 매일 3시 15분에 인증서를 갱신하게 된다.
1 |
15 3 * * * /usr/bin/certbot renew --quiet |