Let's Encrypt 在今年
3
月份就已經推出泛域名證照支援了,以前我一直是使用的單域名證照,加上站點開啟了HSTS
支援,當新增網站應用時不得不為其單獨申請證照,十分不便。
目前比較常用的為 Let's Encrypt
生成證照的工具比較多,如
這裡我們將使用 acme.sh 這個工具來安裝 Let's Encrypt
證照。acme.sh
是一個非常優秀的證照生成工具,其 官網 更是有詳細的中文文件支援 。
安裝
你可以透過下面的指令碼來安裝 acme.sh
curl https://get.acme.sh | sh
該操作需要伺服器支援
socat
及curl
模組。(apt install socat curl)
安裝成功後,會在當前資料夾下生成 .acme.sh
資料夾。
生成證照
acme.sh
實現了acme
協議支援的所有驗證協議,一般有兩種方式驗證:http
和dns
驗證。由於泛域名證照的解析目前僅支援DNS
方式驗證,下面我們將透過DNS
方式來驗證你的域名所有權。
acme.sh --issue --dns -d godruoyi.com -d *.godruoyi.com
這種方式會將相應的解析記錄顯示出來,然後你需要在你的域名管理皮膚中新增這條 txt
記錄。並等待解析完成之後,重新用下面命令生成證照:
acme.sh --renew -d mydomain.com
注意第二次這裡用的是
--renew
,當然我們並不想這麼麻煩,dns
方式的真正強大之處在於可以使用域名解析商提供的api
自動新增txt
記錄完成驗證。
根據你的域名服務商型別,選擇對應的 DNS API。如
1、騰訊雲
在 這裡申請 API Token,獲取到 ID
及 Token
後執行:
export DP_Id="id"
export DP_Key="token"
2、阿里雲
獲取到 KEY
及 Secret
後執行下面命令:
export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"
3、生成證照
在配置好上述設定後,就可透過
.acme.sh/acme.sh --issue --dns dns_dp -d godruoyi.com -d *.godruoyi.com
來生成證照,注意這裡第一個域名為頂級域名,後面個為泛域名。
這種方式將自動為你的域名新增一條
txt
解析,驗證成功後,這條解析記錄會被刪除,所以對你來說是無感的,就是要等120秒
。
證照生成成功後,預設儲存在 .acme.sh/你的頂級域名
中。
配置 Nginx
下面我們來為 Nginx
配置 SSL
證照支援。
1、移動下列證照到 /etc/nginx/ssl
資料夾,若無該資料夾,自行建立。
cp ~/.acme.sh/godruoyi.com/fullchain.cer /etc/nginx/ssl/fullchain.cer
cp ~/.acme.sh/godruoyi.com/godruoyi.com.key /etc/nginx/ssl/godruoyi.key
2、新建 ssl-params.conf
並把它放到 Nginx 的 snippets
目錄中。
下面的這些配置來自 提高安全性的最佳 Nginx 配置,建議參考。
# /etc/nginx/snippets/ssl-params.conf
server_tokens off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 60m;
ssl_session_tickets on;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.4.4 8.8.8.8 valid=300s;
resolver_timeout 10s;
ssl_prefer_server_ciphers on;
# 證照路徑 絕對地址
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/godruoyi.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
add_header Strict-Transport-Security "max-age=31536000;includeSubDomains;preload";
add_header X-Frame-Options deny;
add_header X-Content-Type-Options nosniff;
add_header x-xss-protection "1; mode=block";
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https:; connect-src 'self' https:; img-src 'self' data: https: blob:; style-src 'unsafe-inline' https:; font-src https:";
3、接下來在 Nginx 主配置檔案中開啟 SSL
支援
# /etc/nginx/nginx.conf
http {
....
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
完整的 Nginx
配置檔案請參考 我的 Nginx 配置
4、配置虛擬主機
# /etc/nginx/sites-available/godruoyi.com
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name godruoyi.com www.godruoyi.com;
return 301 https://$server_name$request_uri;
}
server {
# 注意我們設定該站點為預設站點,並移除了 nginx 預設的 default 配置
listen 443 ssl http2 fastopen=3 reuseport default_server;
listen [::]:443 ssl http2 fastopen=3 reuseport default_server;
server_name www.godruoyi.com godruoyi.com;
# 引入 SSL 及 PHP 配置
include snippets/fastcgi-php.conf;
include snippets/ssl-params.conf;
root /home/godruoyi/websites/godruoyi.com/public;
access_log /home/godruoyi/websites/godruoyi.com/storage/logs/nginx-access.log;
error_log /home/godruoyi/websites/godruoyi.com/storage/logs/nginx-error.log error;
index index.php;
# 當訪問域名是不 godruoyi.com 強制跳轉到 https://godruoyi.com
if ($host != 'godruoyi.com' ) {
rewrite ^/(.*)$ https://godruoyi.com/$1 permanent;
}
}
再來看一個 admin.godruoyi.com
的配置
# /etc/nginx/sites-available/admin.godruoyi.com
server {
listen 80;
listen [::]:80;
server_name admin.godruoyi.com;
return 301 https://$server_name$request_uri;
}
server {
# 如果多個域名配置在同一主機,這裡只需要監聽到 433 就可以了,
# 不需要再新增 ssl http2 fastopen=3 reuseport default_server 之類的了
listen 443;
listen [::]:443;
root /home/godruoyi/websites/admin.godruoyi.com/public-admin;
access_log /home/godruoyi/websites/admin.godruoyi.com/storage/logs/nginx-access.log;
error_log /home/godruoyi/websites/admin.godruoyi.com/storage/logs/nginx-error.log error;
server_name admin.godruoyi.com;
index index.php;
client_max_body_size 20M;
include snippets/fastcgi-php.conf;
include snippets/ssl-params.conf;
if ($host != 'admin.godruoyi.com' ) {
rewrite ^/(.*)$ https://admin.godruoyi.com/$1 permanent;
}
}
4、虛擬主機配置完成,接下來為其配置軟連線測試成功後就可以重啟 Nginx 啦。
sudo ln -s /etc/nginx/sites-available/godruoyi.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/admin.godruoyi.com /etc/nginx/sites-enabled/
# 測試配置是否成功
sudo nginx -t
sudo service nginx restart
以上所有配置你都可以在 這裡 找到,別忘了點顆小星星喲 :smile:
文章首發於 二楞的閒談雜魚
參考連結
本作品採用《CC 協議》,轉載必須註明作者和本文連結