Linux 下使用acme.sh生成Let's Encrypt泛域名免費證書


 

一、需求場景

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


二、概念簡介

 

 
Let’s Encrypt


官網:https://letsencrypt.org/

 

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記錄
 
解析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 目前支持 cloudflarednspodcloudxnsgodaddy 以及 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端口)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM