1、Let's Encrypt
申請過SSL證書的人應該對Let's Encrypt這個證書頒發機構不陌生,它免費,而且也被各大瀏覽器所支持和認可.但一般我們申請到的都單域或雙域(www和主域名)的證書.這樣一來,我們需要做全站SSL的工作量就會超級大!有沒有一個辦法,像DNS解析一樣,用*.staryjie.com的方式,讓全站共用一個SSL證書。
2、安裝acme.sh
acme.sh是一個實現了 acme 協議的腳本,可以從 Let's Encrypt 生成我們需要的泛解析SSL證書.當然,你用來生產普通證書也是沒有問題的。
本文僅對使用域名提供/解析商的 API Token 來自動申請泛域名證書的過程進行講解,acme.sh還有很多很強大的功能例如配合 Nginx 或者 Apache 自動申請證書等,請自行查看 github 項目 wiki 發掘。
項目鏈接:Github - acme.sh
安裝方法:
curl https://get.acme.sh | sh
# 或者
wget -O- https://get.acme.sh | sh
安裝過程中可能會出現要你安裝socat的警告,可以忽略。

安裝過程不會修改已有的任何系統功能和文件,請放心食用. acme.sh在程序結束后會被自動安裝到~/.acme.sh/目錄中,你也可以隨時刪除該目錄,不會影響到系統。
3、獲取API Token
由於acme.sh對域名解析/提供商的支持十分廣泛,所以請針對自己所在的域名提供商獲取對應的API Token。
支持列表:點我跳轉
國內目前使用較多的是騰訊雲和阿里雲,獲取API Token的方法分別是:
-
騰訊的
DNSPod登錄DNSPod,進入頂部導航欄里的用戶中心,在左側的導航欄里,找到
安全設置,看到頁面的最下面,有個API Token.點擊查看->創建API Token->填寫Tokens名稱,復制好ID與Token即可.保存待用。 -
阿里雲域名
需要登錄到阿里雲官網獲取Ali_Key和Ali_Secret。點擊此處跳轉
4、配置acme.sh
獲取到對應的API Token之后我們需要將id和key設置為環境變量,供acme.sh調用:
# DNSPod
export DP_Id="你的 API ID"
export DP_Key="你的 Token"
# aliyun
export Ali_Key="你的 AccessKey ID"
export Ali_Secret="你的 AccessKey Secret"
如果你的域名提供商不是DNSPod或者阿里雲,其他域名提供商變量名一覽表:點我查看
臨時環境變量只需配置這一次即可,當成功申請證書后,API 信息會被自動保存在~/.acme.sh/account.conf里,下次你使用acme.sh的時候系統會自動讀取並使用。
5、申請泛域名解析證書
# DNSPod
cd ~/.acme.sh/
# 或者 alias acme.sh=~/.acme.sh/acme.sh
acme.sh --issue -d example.com -d *.example.com --dns dns_dp
# 多個域名只需要"-d 你的域名"即可
# aliyun
cd ~/.acme.sh/
# 或者 alias acme.sh=~/.acme.sh/acme.sh
acme.sh --issue --dns dns_ali -d example.com -d *.example.com
注意:不同的域名解析商所用命令有細微不同!如果你的提供商不是
DNSPod,請自行去上面的鏈接查看!
申請完成后屏顯會輸出證書路徑。

可能會遇到的報錯:

解決辦法:
# 升級curl
yum install -y curl
如果升級curl之后還是如上圖的報錯,則可以嘗試修改域名的DSN設置:

修改之后需要等十分鍾左右。
6、將證書安裝到指定的目錄
默認生成的證書都放在安裝目錄下: ~/.acme.sh/,這個目錄一般來說不能讓nginx或Apache直接使用。所以我們需要將證書放到一個指定的目錄,scrm用nginx配置,本例是指定在/etc/nginx/ssl/目錄下。
mkdir /etc/nginx/ssl
acme.sh --installcert -d staryjie.com \
--keypath /etc/nginx/ssl/staryjie.com.key \
--fullchainpath /etc/nginx/ssl/staryjie.com.key.pem \
--reloadcmd "service nginx force-reload"

7、配置NGINX使用證書
7.1 生成 dhparam.pem 文件
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

7.2 修改nginx配置文件
/etc/nginx/conf.d/bark.conf
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl;
server_name notice.staryjie.com;
ssl_certificate /etc/nginx/ssl/staryjie.com.key.pem;
ssl_certificate_key /etc/nginx/ssl/staryjie.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://127.0.0.1:8888;
}
}
重載配置文件:
systemctl reload nginx.service
測試:

8、證書更新
Let s Encrypt 的證書有效期是 90 天的,需要定期重新申請,不過acme在安裝的時候就已經設置了自動更新,所以這一步不用關心,很省心。
目前證書在 60 天以后會自動更新, 你無需任何操作. 今后有可能會縮短這個時間, 不過都是自動的, 你不用關心。
9、acme.sh的自動更新
acme.sh --upgrade --auto-upgrade
關閉自動更新:
acme.sh --upgrade --auto-upgrade 0
