一、需求場景
自從數年前蘋果開始強制要求所有IOS所有應用必須全部使用 https,以及google、baidu、bing 這三大搜索引擎開始大規模支持 https,https 已經成為現在保障網站完全的最基礎需求,大量的供應商開始出現,並提供證書服務,但是對於一些非盈利性質的網站或博客站長,或公司測試環境也想使用https認證時,並不想在這上面投入太多的資金,於是乎理所當然會想要追求免費且有效的ssl證書了。
二、概念簡介

1、Let's Encrypt 是什么?
Let's Encrypt
作為一個開源 SSL 的項目逐漸被廣大用戶傳播和使用,是由 Mozilla、Cisco、Akamai、IdenTrust、EFF 等組織人員發起,主要的目的也是為了推進網站從 HTTP 向 HTTPS 過度的進程,目前已經有越來越多的商家加入和贊助支持。
和通過openssl等工具生成的證書不同,Let's Encrypt
獲得IdenTrust
交叉簽名,這就是說可以應用且支持包括 FireFox、Chrome 在內的主流瀏覽器的兼容和支持,可以說是真正意義上免費且有效的SSL證書。
2、acme.sh 是什么?
Let's Encrypt
的最大貢獻是它的ACME 協議
,而acme.sh
腳本可以通過ACME 協議
從Let's Encrypt
生成免費的 SSL 證書。
一般生成的證書有效期只有60 ~ 90天,主要是為了避免認證私鑰泄露,但是對於一些非盈利網站和個人網站來說基本是夠用的,對於一些想長期使用的,現在已經有不少的 Let's Encrypt 自動續期腳本了,配好后就不用管了,非常方便。acme.sh
的使用非常“傻瓜式”,只要照着指令參數做就可以輕松搞定的,只需要指定自己的域名就可以用,根據-h
的說明菜單指引,簡單修改一下參數就可以拿來用的。
三、過程步驟
1、安裝acme.sh
官方github: https://github.com/acmesh-official/acme.sh
1)自動安裝
可能由於網絡問題導致安裝失敗
curl https://get.acme.sh | sh
2)手動安裝(推薦)
git clone https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
./acme.sh --install

3)創建cronjob,檢測證書過期
#每天 0:00 點自動檢測所有的證書, 如果快過期了, 需要更新, 則會自動更新證書
0 0 * * * /root/.acme.sh/acme.sh --cron --home /root/.acme.sh > /dev/null
2、生成證書
acme.sh 實現了 acme 協議
支持的所有驗證協議. 一般有兩種方式驗證: http
和 dns
驗證
1)http方式
http 方式需要在你的網站根目錄下放置一個文件, 以此來驗證你的域名所有權,完成驗證,只需要指定域名, 並指定域名所在的網站根目錄,acme.sh 會全自動的生成驗證文件, 並放到網站的根目錄, 然后自動完成驗證,着方式較適合獨立域名的站點使用,比如博客站點等。
./acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
如果你用的 apache服務器, acme.sh 還可以智能的從 apache的配置中自動完成驗證, 你不需要指定網站根目錄:
acme.sh --issue -d mydomain.com --apache
如果你用的 nginx服務器, 或者反代, acme.sh 還可以智能的從 nginx的配置中自動完成驗證, 你不需要指定網站根目錄:
acme.sh --issue -d mydomain.com --nginx
注意: 無論是 apache 還是 nginx 模式, acme.sh在完成驗證之后, 會恢復到之前的狀態, 都不會私自更改你本身的配置,好處是你不用擔心配置被搞壞, 也有一個缺點, 你需要自己配置 ssl 的配置, 否則只能成功生成證書, 你的網站還是無法訪問https,為了安全, 建議手動更改配置
如果你還沒有運行任何 web 服務, 80 端口是空閑的, 那么 acme.sh 還能假裝自己是一個webserver, 臨時聽在80 端口, 完成驗證
acme.sh --issue -d mydomain.com --standalone
2)dns方式
除了上述 http
方式外,另一種方式即手動配置DNS
的方式,十分適合用於生成范解析證書。
優勢:不需要任何服務器, 不需要任何公網 ip, 只需要 dns 的解析記錄即可完成驗證
劣勢:如果不同時配置 Automatic DNS API,使用這種方式 acme.sh 將無法自動更新證書,每次都需要手動再次重新解析驗證域名所有權
1. 生成證書記錄
注意,第一次執行時使用 --issue
,-d
指定需要生成證書的域名
./acme.sh --issue -d *.example.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please

2. 在域名解析中添加TXT記錄

驗證解析生效
1⃣️ 安裝nslookup
yum install -y bind-utils
2⃣️ 查看相應信息
nslookup -q=TXT *.example.com
3. 重新生成證書
注意,這里第二次執行是用的是 --renew
./acme.sh --renew -d *.example.com --yes-I-know-dns-manual-mode-enough-go-ahead-please

4. 配置 Automatic DNS API
dns 方式的真正強大之處在於可以使用域名解析商提供的 api 自動添加 txt 記錄完成驗證,
acme.sh
目前支持cloudflare
,dnspod
,cloudxns
,godaddy
以及ovh
等數十種解析商的自動集成。
以 dnspod 為例
先登錄到 dnspod
賬號, 生成你的 api id
和 api key
, 都是免費的,然后指定自己的需要的參數,如下
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
acme.sh --issue --dns dns_dp -d aa.com -d www.aa.com
證書就會自動生成了. 這里給出的 api id 和 api key 會被自動記錄下來, 將來你在使用 dnspod api 的時候, 就不需要再次指定了,直接生成就好了
acme.sh --issue -d mydomain2.com --dns dns_dp
更詳細的 api 用法:
https://github.com/Neilpang/acme.sh/blob/master/dnsapi/README.md
3、安裝證書
上述操作后,我們已生成好了正式可用的ssl證書,之后需要加載正式文件才可以真正生效。正確的使用方法是使用--install-cert
,並指定copy到目標目錄相應位置
1)Apache 示例
./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"
2)Nginx 示例
./acme.sh --install-cert -d *.example.com \
--key-file /data/conf/nginx/ssl/example.com/key.pem \
--fullchain-file /data/conf/nginx/ssl/example.com/cert.pem
如果要直接加載配置,可以使用 --reloadcmd "service nginx force-reload"
,但是由於nginx 的配置可能不盡相同,所以一般選擇手動 reload nginx
注意: Nginx 的配置 ssl_certificate
使用 /etc/nginx/ssl/fullchain.cer
,而非 /etc/nginx/ssl/<domain>.cer
,否則 nginx -t 會報 Chain issues Incomplete
錯誤。
3)Tomcat 示例
echo $PWD
/root/.acme.sh/*.example.com
1. 導出.p12格式的證書
openssl pkcs12 -export -in fullchain.cer -inkey *.example.com.key -out *.example.com.p12 -name tomcat_letsencrypt
2. 將證書由.p12格式轉換成.jks格式
keytool -importkeystore -deststorepass '123456' -destkeypass '123456' -destkeystore *.example.com.jks -srckeystore *.example.com.p12 -srcstoretype PKCS12 -srcstorepass '123456' -alias tomcat_letsencrypt
3. 修改Tomcat配置
修改 %tomcat%/conf/server.xml 文件,添加 keystoreFile 和 keystorePass 兩行配置。其中,keystoreFile 指向 jks 證書文件,而 keystorePass 則為證書的密,修改后的關鍵配置如下:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="/home/test/*.example.com.jks" keystorePass="123456" />
4、更新證書
目前證書在 60 天以后會自動更新, 你無需任何操作. 今后有可能會縮短這個時間, 不過都是自動的, 你不用關心
5、更新腳本
目前由於 acme 協議和 letsencrypt CA 都在頻繁的更新, 因此 acme.sh 也經常更新以保持同步
1) 手動升級 acme.sh 到最新版
acme.sh --upgrade
2)自動升級
如果你不想手動升級, 可以開啟自動升級,之后, acme.sh 就會自動保持更新了
acme.sh --upgrade --auto-upgrade
3)關閉自動更新
acme.sh --upgrade --auto-upgrade 0
6、出錯排查
如果出錯, 請添加 debug log:
acme.sh --issue ..... --debug
或者:
acme.sh --issue ..... --debug 2
參考文檔:
1、acme.sh官方github
2、Let's Encrypt 官網
3、Linux 下使用 acme.sh 申請和管理 Let’s Encrypt 證書
4、申請Let's Encrypt泛域名免費證書(無需域名80端口)