ssl 免費(fèi)證書獲取
ssl證書獲取方式有很多,大致分為兩類。一類是通過服務(wù)商去申請(qǐng),有花錢的,也有不花錢的。一類就是免費(fèi)的,百度一搜也能搜一大把,但免費(fèi)的一般可用時(shí)間都在3個(gè)月左右,需要自己去手動(dòng)續(xù)簽。
下面介紹免費(fèi)自動(dòng)續(xù)簽的方法。
gitee https推薦的證書申請(qǐng)網(wǎng)站
acme.sh自動(dòng)申請(qǐng)續(xù)簽
1. 安裝acme.sh
安裝很簡(jiǎn)單, 一個(gè)命令:
curl https://get.acme.sh | sh
普通用戶和 root 用戶都可以安裝使用. 安裝過程進(jìn)行了以下幾步:
- 把
acme.sh安裝到你的home目錄下:
~/.acme.sh/

并創(chuàng)建 一個(gè) bash 的 alias, 方便你的使用: alias acme.sh=~/.acme.sh/acme.sh
- 自動(dòng)為你創(chuàng)建
cronjob, 每天0:00點(diǎn)自動(dòng)檢測(cè)所有的證書, 如果快過期了, 需要更新, 則會(huì)自動(dòng)更新證書.
更高級(jí)的安裝選項(xiàng)請(qǐng)參考: How-to-install
安裝過程不會(huì)污染已有的系統(tǒng)任何功能和文件, 所有的修改都限制在安裝目錄中: ~/.acme.sh/
2. 生成證書
acme.sh 實(shí)現(xiàn)了 acme 協(xié)議支持的所有驗(yàn)證協(xié)議. 一般有兩種方式驗(yàn)證: http 和 dns 驗(yàn)證.
- http 方式需要在你的網(wǎng)站根目錄下放置一個(gè)文件, 來驗(yàn)證你的域名所有權(quán),完成驗(yàn)證. 然后就可以生成證書了.
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
只需要指定域名, 并指定域名所在的網(wǎng)站根目錄. acme.sh 會(huì)全自動(dòng)的生成驗(yàn)證文件, 并放到網(wǎng)站的根目錄, 然后自動(dòng)完成驗(yàn)證. 最后會(huì)聰明的刪除驗(yàn)證文件. 整個(gè)過程沒有任何副作用.
如果你用的 apache服務(wù)器, acme.sh 還可以智能的從 apache的配置中自動(dòng)完成驗(yàn)證, 你不需要指定網(wǎng)站根目錄:
acme.sh --issue -d mydomain.com --apache
如果你用的 nginx服務(wù)器, 或者反代, acme.sh 還可以智能的從 nginx的配置中自動(dòng)完成驗(yàn)證, 你不需要指定網(wǎng)站根目錄:
acme.sh --issue -d mydomain.com --nginx
注意, 無論是 apache 還是 nginx 模式, acme.sh在完成驗(yàn)證之后, 會(huì)恢復(fù)到之前的狀態(tài), 都不會(huì)私自更改你本身的配置. 好處是你不用擔(dān)心配置被搞壞, 也有一個(gè)缺點(diǎn), 你需要自己配置 ssl 的配置, 否則只能成功生成證書, 你的網(wǎng)站還是無法訪問https. 但是為了安全, 你還是自己手動(dòng)改配置吧.
如果你還沒有運(yùn)行任何 web 服務(wù), 80 端口是空閑的, 那么 acme.sh 還能假裝自己是一個(gè)webserver, 臨時(shí)聽在80 端口, 完成驗(yàn)證:
acme.sh --issue -d mydomain.com --standalone
更高級(jí)的用法請(qǐng)參考: How-to-issue-a-cert
- 手動(dòng) dns 方式, 手動(dòng)在域名上添加一條 txt 解析記錄, 驗(yàn)證域名所有權(quán).
這種方式的好處是, 你不需要任何服務(wù)器, 不需要任何公網(wǎng) ip, 只需要 dns 的解析記錄即可完成驗(yàn)證. 壞處是,如果不同時(shí)配置 Automatic DNS API,使用這種方式 acme.sh 將無法自動(dòng)更新證書,每次都需要手動(dòng)再次重新解析驗(yàn)證域名所有權(quán)。
acme.sh --issue --dns -d mydomain.com
然后, acme.sh 會(huì)生成相應(yīng)的解析記錄顯示出來, 你只需要在你的域名管理面板中添加這條 txt 記錄即可.
等待解析完成之后, 重新生成證書:
acme.sh --renew -d mydomain.com
注意第二次這里用的是 --renew
dns 方式的真正強(qiáng)大之處在于可以使用域名解析商提供的 api 自動(dòng)添加 txt 記錄完成驗(yàn)證.
acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等數(shù)十種解析商的自動(dòng)集成.
以 dnspod 為例, 你需要先登錄到 dnspod 賬號(hào), 生成你的 api id 和 api key, 都是免費(fèi)的. 然后:
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
acme.sh --issue --dns dns_dp -d aa.com -d www.aa.com
設(shè)置進(jìn)文件,避免丟失

證書就會(huì)自動(dòng)生成了. 這里給出的 api id 和 api key 會(huì)被自動(dòng)記錄下來, 將來你在使用 dnspod api 的時(shí)候, 就不需要再次指定了. 直接生成就好了:
acme.sh --issue -d mydomain2.com --dns dns_dp
更詳細(xì)的 api 用法: https://github.com/Neilpang/acme.sh/blob/master/dnsapi/README.md
3. copy/安裝 證書
前面證書生成以后, 接下來需要把證書 copy 到真正需要用它的地方.
注意, 默認(rèn)生成的證書都放在安裝目錄下: ~/.acme.sh/, 請(qǐng)不要直接使用此目錄下的文件, 例如: 不要直接讓 nginx/apache 的配置文件使用這下面的文件. 這里面的文件都是內(nèi)部使用, 而且目錄結(jié)構(gòu)可能會(huì)變化.
正確的使用方法是使用 --install-cert 命令,并指定目標(biāo)位置, 然后證書文件會(huì)被copy到相應(yīng)的位置, 例如:
Apache example:
acme.sh --install-cert -d example.com \
--cert-file /path/to/certfile/in/apache/cert.pem \
--key-file /path/to/keyfile/in/apache/key.pem \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd "service apache2 force-reload"
Nginx example:
acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx force-reload"
(一個(gè)小提醒, 這里用的是 service nginx force-reload, 不是 service nginx reload, 據(jù)測(cè)試, reload 并不會(huì)重新加載證書, 所以用的 force-reload)
Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/<domain>.cer ,否則 SSL Labs 的測(cè)試會(huì)報(bào) Chain issues Incomplete 錯(cuò)誤。
--install-cert命令可以攜帶很多參數(shù), 來指定目標(biāo)文件. 并且可以指定 reloadcmd, 當(dāng)證書更新以后, reloadcmd會(huì)被自動(dòng)調(diào)用,讓服務(wù)器生效.
詳細(xì)參數(shù)請(qǐng)參考: https://github.com/Neilpang/acme.sh#3-install-the-issued-cert-to-apachenginx-etc
值得注意的是, 這里指定的所有參數(shù)都會(huì)被自動(dòng)記錄下來, 并在將來證書自動(dòng)更新以后, 被再次自動(dòng)調(diào)用.
4. 更新證書
目前證書在 60 天以后會(huì)自動(dòng)更新, 你無需任何操作. 今后有可能會(huì)縮短這個(gè)時(shí)間, 不過都是自動(dòng)的, 你不用關(guān)心.
5. 更新 acme.sh
- 更新 acme.sh
目前由于 acme 協(xié)議和 letsencrypt CA 都在頻繁的更新, 因此 acme.sh 也經(jīng)常更新以保持同步.
升級(jí) acme.sh 到最新版 :
acme.sh --upgrade
如果你不想手動(dòng)升級(jí), 可以開啟自動(dòng)升級(jí):
acme.sh --upgrade --auto-upgrade
之后, acme.sh 就會(huì)自動(dòng)保持更新了.
你也可以隨時(shí)關(guān)閉自動(dòng)更新:
acme.sh --upgrade --auto-upgrade 0