通過(guò)acme.sh開(kāi)源工具申請泛解析SSL證書(shū)
前期準備
1.域名
2.Linux云服務(wù)器(本文系統某訊云的Centos7),測試公網(wǎng)IP為:150.158.130.33
3.域名服務(wù)商的API Token,或者域名解析到申請SSL云服務(wù)器IP(實(shí)驗項目: ssl.xgss.net)
安裝acme.sh
普通用戶(hù)和 root 用戶(hù)都可以安裝使用. 安裝過(guò)程進(jìn)行了以下幾步:
yum install socat -ycurl https://get.acme.sh | shcurl https://get.acme.sh | sh -s email=my@example.com(zerossl.com注冊的郵箱賬號,在瀏覽器登錄ZeroSSL之后可以看到證書(shū))或者wget -O- https://get.acme.sh | sh
國內的服務(wù)器下載github可能會(huì )比較慢,如果下載失敗,可以多執行幾次。
1、把 acme.sh 安裝到你的 home 目錄下:~/.acme.sh/ 裝過(guò)程不會(huì )污染已有的系統任何功能和文件, 所有的修改都限制在安裝目錄中: ~/.acme.sh/
2、并創(chuàng )建 一個(gè) bash 的 alias, 方便你的使用: alias acme.sh=~/.acme.sh/acme.sh
3、自動(dòng)為你創(chuàng )建 cronjob, 每天 0:00 點(diǎn)自動(dòng)檢測所有的證書(shū), 如果快過(guò)期了, 需要更新, 則會(huì )自動(dòng)更新證書(shū).
把 acme.sh 安裝到你的 home 目錄下:~/.acme.sh/并創(chuàng )建 一個(gè) bash 的 alias, 方便你的使用:
aliasacme.sh=~/.acme.sh/acme.sh
echoalias acme.sh=~/.acme.sh/acme.sh>>/etc/profile
常用命令
acme.sh --help獲取幫助acme.sh --version查看版本
關(guān)聯(lián) ZeroSSL
目前 acme.sh 支持四個(gè)正式環(huán)境 CA,分別是 Let’s Encrypt、Buypass、ZeroSSL 和 SSL.com,默認使用 ZeroSSL,所以我們不用切換。如果不放心,可以設置一下:
acme.sh --set-default-ca --server zerossl
生成證書(shū)
acme.sh 實(shí)現了 acme 協(xié)議支持的所有驗證協(xié)議. 一般有兩種方式驗證: HTTP 和 DNS 驗證。
如果有條件建議使用DNS驗證,
HTTP認證
此方法好像不支持域名的泛解析,筆者想泛解析做泛域名的認證,但一直不成功,不知道什么原因。
域名解析
ssl.xgss.netA記錄解析到 150.158.130.33只解析上面一條即可,因為只是為ssl.xgss.net申請證書(shū),后面的解析是為了實(shí)驗能否申請到多*.xgss.net的證書(shū)xgss.netA記錄解析到 150.158.130.33*.xgss.netA記錄解析到 150.158.130.33
配置http站點(diǎn)
mkdir -p /data/wwwroot/web/ssl.xgss.net/echo hello SSL> /data/wwwroot/web/ssl.xgss.net/index.html配置nginx站點(diǎn)server{listen80;access_log/dev/null;error_log/dev/null;server_namessl.xgss.net xgss.net;root/data/wwwroot/web/ssl.xgss.net/;location/ {indexindex.html index.htm index.php;}}
驗證是否配置正常
curl http://ssl.xgss.net/hello SSL
http 方式需要在你的網(wǎng)站根目錄下放置一個(gè)文件, 來(lái)驗證你的域名所有權,完成驗證. 然后就可以生成證書(shū)了.
acme.sh--issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
只需要指定域名, 并指定域名所在的網(wǎng)站根目錄. acme.sh 會(huì )全自動(dòng)的生成驗證文件, 并放到網(wǎng)站的根目錄, 然后自動(dòng)完成驗證. 最后會(huì )聰明的刪除驗證文件. 整個(gè)過(guò)程沒(méi)有任何副作用.
如果你用的 nginx服務(wù)器, 或者反代, acme.sh 還可以智能的從 nginx的配置中自動(dòng)完成驗證, 你不需要指定網(wǎng)站根目錄:
acme.sh--issue-dmydomain.com--nginx
注意, 無(wú)論是 apache 還是 nginx 模式, acme.sh在完成驗證之后, 會(huì )恢復到之前的狀態(tài), 都不會(huì )私自更改你本身的配置. 好處是你不用擔心配置被搞壞, 也有一個(gè)缺點(diǎn), 你需要自己配置 ssl 的配置, 否則只能成功生成證書(shū), 你的網(wǎng)站還是無(wú)法訪(fǎng)問(wèn)https. 但是為了安全, 你還是自己手動(dòng)改配置吧.
如果你還沒(méi)有運行任何 web 服務(wù),80端口是空閑的, 那么acme.sh還能假裝自己是一個(gè)webserver, 臨時(shí)聽(tīng)在80端口, 完成驗證:
acme.sh--issue-dmydomain.com--standalone
https://app.zerossl.com/signup 使用郵箱注冊一個(gè)賬號,假設賬號的郵箱為:"XXXX@163.com"
/root/.acme.sh/acme.sh --register-account -m XXXX@163.com[MonJun2713:37:27CST2022]NoEABcredentialsfoundforZeroSSL,letsgetone[MonJun2713:37:30CST2022]Registering account:https://acme.zerossl.com/v2/DV90[MonJun2713:37:38CST2022]Registered[MonJun2713:37:38CST2022]ACCOUNT_THUMBPRINT=*********************
申請證書(shū)
將證書(shū)放到一個(gè)指定的目錄,scrm用nginx配置,本例是指定在/data/wwwroot/web/ssl目錄下
1.創(chuàng )建ssl存放目錄
mkdir -p /data/wwwroot/web/ssl
2.申請SSL證書(shū)
申請單域名證書(shū),并且指定證書(shū)存放的目錄
/root/.acme.sh/acme.sh --issue -d ssl.xgss.net --webroot /data/wwwroot/web/ssl.xgss.net/
--keypath /data/wwwroot/web/ssl/ssl.xgss.net.key
--fullchainpath /data/wwwroot/web/ssl/ssl.xgss.net.key.pem
--reloadcmd"/usr/local/openresty/nginx/sbin/nginx -s reload"
--reloadcmd 表示復制完成后重啟服務(wù)器的命令,根據自己服務(wù)器狀況填寫(xiě)。
/data/wwwroot/web/ssl/ 需要自己建立好,如果文件夾不存在,會(huì )報錯。
3.生成dhparam文件
openssl dhparam -out/data/wwwroot/web/ssl/dhparam.pem2048
4.配置ssl.xgss.net的nginx配置。
server{listen443ssl;access_log/dev/null;error_log/dev/null;server_namessl.xgss.net;root/data/wwwroot/web/ssl.xgss.net/ ;ssl_certificate/data/wwwroot/web/ssl/ssl.xgss.net.key.pem;ssl_certificate_key/data/wwwroot/web/ssl/ssl.xgss.net.key;ssl_protocolsTLSv1 TLSv1.1TLSv1.2;ssl_prefer_server_cipherson;ssl_dhparam/data/wwwroot/web/ssl/dhparam.pem;location/ {indexindex.html index.htm index.php;
}
}
瀏覽器訪(fǎng)問(wèn): https://ssl.xgss.net
證書(shū)信息
ZeroSSL官網(wǎng)證書(shū)截圖
DNS認證
手動(dòng)DNS方式
手動(dòng)在域名上添加一條 txt 解析記錄, 驗證域名所有權。
這種方式的好處是, 你不需要任何服務(wù)器, 不需要任何公網(wǎng) ip, 只需要 dns 的解析記錄即可完成驗證. 壞處是,如果不同時(shí)配置 Automatic DNS API,使用這種方式 acme.sh 將無(wú)法自動(dòng)更新證書(shū),每次都需要手動(dòng)再次重新解析驗證域名所有權。
acme.sh--issue --dns -d mydomain.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
然后, acme.sh 會(huì )生成相應的解析記錄顯示出來(lái), 你只需要在你的域名管理面板中添加這條 txt 記錄即可.
等待解析完成之后, 重新生成證書(shū):
acme.sh--renew -d mydomain.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
注意第二次這里用的是--renew
自動(dòng)DNS方式
dns 方式的真正強大之處在于可以使用域名解析商提供的 api 自動(dòng)添加 txt 記錄完成驗證.
由于acme.sh對域名解析/提供商的支持十分廣泛,所以請針對自己所在的域名提供商獲取對應的API Token,目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等數十種解析商的自動(dòng)集成.
支持列表:點(diǎn)我跳轉 |https://github.com/acmesh-official/acme.sh/wiki/dnsapi
國內目前使用較多的是某訊云和某里云,獲取API Token的方法分別是:
某訊云的DNSPod登錄DNSPod,進(jìn)入頂部導航欄里的用戶(hù)中心,在左側的導航欄里,找到安全設置,看到頁(yè)面的最下面,有個(gè)API Token.點(diǎn)擊查看->創(chuàng )建API Token->填寫(xiě)Tokens名稱(chēng),復制好ID與Token即可.保存待用。某里云域名需要登錄到某里云官網(wǎng)獲取Ali_Key和Ali_Secret。點(diǎn)擊此處跳轉 | https://usercenter.console.aliyun.com//manage/ak當然可以直接使用accessKey
某里云API Token申請
申請子賬戶(hù)來(lái)申請。
詳細就不列舉了,有疑問(wèn)可以后臺提交工單。
申請泛解析域名證書(shū)
獲取到對應的API Token之后我們需要將id和key設置為環(huán)境變量,供acme.sh調用:
DNSPodexportDP_Id="你的 API ID"exportDP_Key="你的 Token"aliyunexportAli_Key="你的 AccessKey ID"exportAli_Secret="你的 AccessKey Secret"
臨時(shí)環(huán)境變量只需配置這一次即可,當成功申請證書(shū)后,API 信息會(huì )被自動(dòng)保存在~/.acme.sh/account.conf里,下次你使用acme.sh的時(shí)候系統會(huì )自動(dòng)讀取并使用。
騰訊云DNSpod:
acme.sh--issue-dexample.com-d*.example.com--dnsdns_dp
阿里云:
acme.sh--issue-dexample.com-d*.example.com--dnsdns_aliacme.sh--issue-dxgss.net-d*.xgss.net--dnsdns_ali--keypath/data/wwwroot/web/ssl/all.xgss.net.key--fullchainpath/data/wwwroot/web/ssl/all.xgss.net.key.pem--reloadcmd"/usr/local/openresty/nginx/sbin/nginx -s reload"openssldhparam-out/data/wwwroot/web/ssl/dhparam.pem2048ll /data/wwwroot/web/ssltotal16-rw-------1rootroot1679Jun2719:02all.xgss.net.key-rw-r--r--1rootroot6684Jun2719:02all.xgss.net.key.pem-rw-r--r--1rootroot424Jun2719:03dhparam.pem
(一個(gè)小提醒, 這里用的是 service nginx force-reload, 不是 service nginx reload, 據測試, reload 并不會(huì )重新加載證書(shū), 所以用的 force-reload)
你的KEY和Secret都將明文保存‘~/.acme.sh/account.conf’文件中,注意保護隱私。
域名后臺新增了兩條記錄
驗證SSL
瀏覽器打開(kāi)網(wǎng)址,點(diǎn)擊地址的小鎖圖標,可以查看更多信息。
curl https://ssl2.xgss.net/hello SSL
[root@shanghai-node02 ssl]curl https://ssl3.xgss.net/hello SSL
[root@shanghai-node02 ssl]curl https://ssl4.xgss.net/hello SSL
定時(shí)更新證書(shū)
安裝過(guò)程中會(huì )自動(dòng)為你創(chuàng )建 cronjob, 每天 0:00 點(diǎn)自動(dòng)檢測所有的證書(shū), 如果快過(guò)期了, 需要更新, 則會(huì )自動(dòng)更新證書(shū)。
0000* * * root/root/.acme.sh/acme.sh --cron --home /root/.acme.sh &>/var/log/acme.sh.logs
查看已安裝證書(shū)的信息
acme.sh--info-dxgss.net
更新證書(shū)
目前證書(shū)在 60 天以后會(huì )自動(dòng)更新, 你無(wú)需任何操作. 今后有可能會(huì )縮短這個(gè)時(shí)間, 不過(guò)都是自動(dòng)的, 你不用關(guān)心.
請確保 cronjob 正確安裝, 看起來(lái)是類(lèi)似這樣的:
crontab -l56* * * *"/root/.acme.sh"/acme.sh --cron --home"/root/.acme.sh">/dev/null
更新acme.sh
目前由于 acme 協(xié)議和 letsencrypt CA 都在頻繁的更新, 因此 acme.sh 也經(jīng)常更新以保持同步.
升級 acme.sh 到最新版
acme.sh--upgrade
如果你不想手動(dòng)升級, 可以開(kāi)啟自動(dòng)升級:
acme.sh --upgrade --auto-upgrade
之后, acme.sh 就會(huì )自動(dòng)保持更新了.
你也可以隨時(shí)關(guān)閉自動(dòng)更新:
acme.sh --upgrade --auto-upgrade0
參考
官方中文說(shuō)明:https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E