Linux 下使用acme.sh生成Let's Encrypt泛域名免費(fèi)證書(shū)

一、需求場(chǎng)景

自從數(shù)年前蘋(píng)果開(kāi)始強(qiáng)制要求所有IOS所有應(yīng)用必須全部使用 https,以及google、baidu、bing 這三大搜索引擎開(kāi)始大規(guī)模支持 https,https 已經(jīng)成為現(xiàn)在保障網(wǎng)站完全的最基礎(chǔ)需求,大量的供應(yīng)商開(kāi)始出現(xiàn),并提供證書(shū)服務(wù),但是對(duì)于一些非盈利性質(zhì)的網(wǎng)站或博客站長(zhǎng),或公司測(cè)試環(huán)境也想使用https認(rèn)證時(shí),并不想在這上面投入太多的資金,于是乎理所當(dāng)然會(huì)想要追求免費(fèi)且有效的ssl證書(shū)了。


二、概念簡(jiǎn)介

Let’s Encrypt

官網(wǎng):https://letsencrypt.org/

1、Let's Encrypt 是什么?

Let's Encrypt 作為一個(gè)開(kāi)源 SSL 的項(xiàng)目逐漸被廣大用戶傳播和使用,是由 Mozilla、Cisco、Akamai、IdenTrust、EFF 等組織人員發(fā)起,主要的目的也是為了推進(jìn)網(wǎng)站從 HTTP 向 HTTPS 過(guò)度的進(jìn)程,目前已經(jīng)有越來(lái)越多的商家加入和贊助支持。
和通過(guò)openssl等工具生成的證書(shū)不同,Let's Encrypt 獲得 IdenTrust 交叉簽名,這就是說(shuō)可以應(yīng)用且支持包括 FireFox、Chrome 在內(nèi)的主流瀏覽器的兼容和支持,可以說(shuō)是真正意義上免費(fèi)且有效的SSL證書(shū)。

2、acme.sh 是什么?

Let's Encrypt 的最大貢獻(xiàn)是它的 ACME 協(xié)議,而 acme.sh 腳本可以通過(guò) ACME 協(xié)議Let's Encrypt 生成免費(fèi)的 SSL 證書(shū)。
一般生成的證書(shū)有效期只有60 ~ 90天,主要是為了避免認(rèn)證私鑰泄露,但是對(duì)于一些非盈利網(wǎng)站和個(gè)人網(wǎng)站來(lái)說(shuō)基本是夠用的,對(duì)于一些想長(zhǎng)期使用的,現(xiàn)在已經(jīng)有不少的 Let's Encrypt 自動(dòng)續(xù)期腳本了,配好后就不用管了,非常方便。
acme.sh 的使用非?!吧倒鲜健保灰罩噶顓?shù)做就可以輕松搞定的,只需要指定自己的域名就可以用,根據(jù)-h的說(shuō)明菜單指引,簡(jiǎn)單修改一下參數(shù)就可以拿來(lái)用的。


三、過(guò)程步驟

1、安裝acme.sh

官方github: https://github.com/acmesh-official/acme.sh

1)自動(dòng)安裝

可能由于網(wǎng)絡(luò)問(wèn)題導(dǎo)致安裝失敗

curl  https://get.acme.sh | sh

2)手動(dòng)安裝(推薦)

git clone https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
./acme.sh --install
手動(dòng)安裝

3)創(chuàng)建cronjob,檢測(cè)證書(shū)過(guò)期

#每天 0:00 點(diǎn)自動(dòng)檢測(cè)所有的證書(shū), 如果快過(guò)期了, 需要更新, 則會(huì)自動(dòng)更新證書(shū)
0 0 * * * /root/.acme.sh/acme.sh --cron --home /root/.acme.sh > /dev/null

2、生成證書(shū)

acme.sh 實(shí)現(xiàn)了 acme 協(xié)議支持的所有驗(yàn)證協(xié)議. 一般有兩種方式驗(yàn)證: httpdns 驗(yàn)證

1)http方式

http 方式需要在你的網(wǎng)站根目錄下放置一個(gè)文件, 以此來(lái)驗(yàn)證你的域名所有權(quán),完成驗(yàn)證,只需要指定域名, 并指定域名所在的網(wǎng)站根目錄,acme.sh 會(huì)全自動(dòng)的生成驗(yàn)證文件, 并放到網(wǎng)站的根目錄, 然后自動(dòng)完成驗(yàn)證,著方式較適合獨(dú)立域名的站點(diǎn)使用,比如博客站點(diǎn)等。

./acme.sh  --issue  -d mydomain.com -d www.mydomain.com  --webroot  /home/wwwroot/mydomain.com/

如果你用的 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

注意: 無(wú)論是 apache 還是 nginx 模式, acme.sh在完成驗(yàn)證之后, 會(huì)恢復(fù)到之前的狀態(tài), 都不會(huì)私自更改你本身的配置,好處是你不用擔(dān)心配置被搞壞, 也有一個(gè)缺點(diǎn), 你需要自己配置 ssl 的配置, 否則只能成功生成證書(shū), 你的網(wǎng)站還是無(wú)法訪問(wèn)https,為了安全, 建議手動(dòng)更改配置

如果你還沒(méi)有運(yùn)行任何 web 服務(wù), 80 端口是空閑的, 那么 acme.sh 還能假裝自己是一個(gè)webserver, 臨時(shí)聽(tīng)在80 端口, 完成驗(yàn)證

acme.sh  --issue -d mydomain.com   --standalone

2)dns方式

除了上述 http方式外,另一種方式即手動(dòng)配置DNS的方式,十分適合用于生成范解析證書(shū)。
優(yōu)勢(shì):不需要任何服務(wù)器, 不需要任何公網(wǎng) ip, 只需要 dns 的解析記錄即可完成驗(yàn)證
劣勢(shì):如果不同時(shí)配置 Automatic DNS API,使用這種方式 acme.sh 將無(wú)法自動(dòng)更新證書(shū),每次都需要手動(dòng)再次重新解析驗(yàn)證域名所有權(quán)

1. 生成證書(shū)記錄

注意,第一次執(zhí)行時(shí)使用 --issue,-d 指定需要生成證書(shū)的域名

./acme.sh --issue -d *.example.com  --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
申請(qǐng)域名證書(shū)
2. 在域名解析中添加TXT記錄
解析TXT記錄
驗(yàn)證解析生效

1?? 安裝nslookup

yum install -y bind-utils

2?? 查看相應(yīng)信息

nslookup -q=TXT *.example.com
3. 重新生成證書(shū)

注意,這里第二次執(zhí)行是用的是 --renew

./acme.sh --renew -d *.example.com  --yes-I-know-dns-manual-mode-enough-go-ahead-please
重新生成證書(shū)
4. 配置 Automatic DNS API

dns 方式的真正強(qiáng)大之處在于可以使用域名解析商提供的 api 自動(dòng)添加 txt 記錄完成驗(yàn)證,acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等數(shù)十種解析商的自動(dòng)集成。

以 dnspod 為例

先登錄到 dnspod 賬號(hào), 生成你的 api idapi key, 都是免費(fèi)的,然后指定自己的需要的參數(shù),如下

export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
acme.sh   --issue   --dns dns_dp   -d aa.com  -d www.aa.com

證書(shū)就會(huì)自動(dòng)生成了. 這里給出的 api id 和 api key 會(huì)被自動(dòng)記錄下來(lái), 將來(lái)你在使用 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、安裝證書(shū)

上述操作后,我們已生成好了正式可用的ssl證書(shū),之后需要加載正式文件才可以真正生效。正確的使用方法是使用--install-cert,并指定copy到目標(biāo)目錄相應(yīng)位置

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 的配置可能不盡相同,所以一般選擇手動(dòng) reload nginx
注意: Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/<domain>.cer ,否則 nginx -t 會(huì)報(bào) Chain issues Incomplete 錯(cuò)誤。

3)Tomcat 示例

echo $PWD
/root/.acme.sh/*.example.com
1. 導(dǎo)出.p12格式的證書(shū)
openssl pkcs12 -export -in fullchain.cer -inkey *.example.com.key -out *.example.com.p12 -name tomcat_letsencrypt
2. 將證書(shū)由.p12格式轉(zhuǎn)換成.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 證書(shū)文件,而 keystorePass 則為證書(shū)的密,修改后的關(guān)鍵配置如下:

<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、更新證書(shū)

目前證書(shū)在 60 天以后會(huì)自動(dòng)更新, 你無(wú)需任何操作. 今后有可能會(huì)縮短這個(gè)時(shí)間, 不過(guò)都是自動(dòng)的, 你不用關(guān)心


5、更新腳本

目前由于 acme 協(xié)議和 letsencrypt CA 都在頻繁的更新, 因此 acme.sh 也經(jīng)常更新以保持同步

1) 手動(dòng)升級(jí) acme.sh 到最新版

acme.sh --upgrade

2)自動(dòng)升級(jí)

如果你不想手動(dòng)升級(jí), 可以開(kāi)啟自動(dòng)升級(jí),之后, acme.sh 就會(huì)自動(dòng)保持更新了

acme.sh  --upgrade  --auto-upgrade

3)關(guān)閉自動(dòng)更新

acme.sh --upgrade  --auto-upgrade  0

6、出錯(cuò)排查

如果出錯(cuò), 請(qǐng)?zhí)砑?debug log:

acme.sh  --issue  .....  --debug 

或者:

acme.sh  --issue  .....  --debug  2

參考文檔:

1、acme.sh官方github
2、Let's Encrypt 官網(wǎng)
3、Linux 下使用 acme.sh 申請(qǐng)和管理 Let’s Encrypt 證書(shū)
4、申請(qǐng)Let's Encrypt泛域名免費(fèi)證書(shū)(無(wú)需域名80端口)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容