nginx + nodejs 使用 certbot
以下的設定參考 教學-申請Let’s Encrypt憑證與啟用https。
承上篇,在 nginx 設定中加入一個 server /etc/nginx/sites-enabled/www.shinder.cc
,並設定為:
server {
listen 80;
server_name www.shinder.cc shinder.cc;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
}
}
啟動 node/express server,使用 port 3000。
然後測試 http://www.shinder.cc
是否可以看到 node/express 的執行內容。
安裝 certbot:
sudo add-apt-repository ppa:certbot/certbot
sudo apt update
sudo apt install certbot
申請憑證:
sudo certbot certonly --webroot --webroot-path=/home/ubuntu/<express專案>/public/ -d www.shinder.cc -d shinder.cc
接著會有幾個詢問, email,是否同意授權,email是否要接收訊息等等。最後就是 key 所放的位置:
/etc/letsencrypt/live/www.shinder.cc/fullchain.pem
/etc/letsencrypt/live/www.shinder.cc/privkey.pem
為了增加安全性產生一個2048-bit Diffie-Hellman的密碼組合:產生的 /etc/ssl/certs/dhparam.pem
之後會用到:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
更改 nginx 設定
建立設定檔 /etc/nginx/snippets/ssl-www.shinder.cc.conf
:
ssl_certificate /etc/letsencrypt/live/www.shinder.cc/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.shinder.cc/privkey.pem;
建立另一個設定檔 /etc/nginx/snippets/ssl-params.conf
:
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;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
最後修改 nginx 設定檔 /etc/nginx/sites-enabled/www.shinder.cc
:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
include snippets/ssl-www.shinder.cc.conf;
include snippets/ssl-params.conf;
server_name www.shinder.cc shinder.cc;
client_max_body_size 1G;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
}
}
server {
listen 80;
server_name www.shinder.cc shinder.cc;
return 301 https://$server_name$request_uri;
}
nginx 重新載入設定就可以測試 https 了。
自動更新憑證
使用 crontab 排程:
sudo crontab –e
加入下行,每日早上七點更新:
10 7 * * * /usr/bin/certbot renew --quiet --renew-hook "/bin/systemctl reload nginx"
如果 web document root 變更了,可以在 /etc/letsencrypt/renewal/www.shinder.cc.conf
檔案內修改 webroot_map 。