一、需求場(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)介

官網(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

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)證: http 和 dns 驗(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

2. 在域名解析中添加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

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 id 和 api 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端口)