這個神器真牛 x,HTTPS 數(shù)字證書全自動管理

這兩天在給自己的網(wǎng)站做 SEO ,順便想到了之前寫過的幾個在線文檔一直都是 http 協(xié)議,之前為什么一直沒有上,是因為那個在線文檔,使用的是 RTD 進行托管,它給我省了很多事,我愿意犧牲 https,都是文檔類,也沒什么重要數(shù)據(jù),不用管安全不安全的。
但最近在做主站的 SEO ,聽說現(xiàn)在 https 的權(quán)重要遠大于 http ,所以還是要好好搞一下。
雖然在 RTD 的界面上也表示可以配置 https ,但是實際配置并沒有效果,也沒有可以配置數(shù)字證書的地方。

這是我第一次有了放棄 RTD 的想法。
后來我又關(guān)注了下 sitemap,原來 RTD 構(gòu)建出來的 sitemap.xml 一直是有問題的,而且摸索了很久,也沒有找到解決方案。害,用人家的黑盒子 就是這么麻煩,出現(xiàn)問題想自己調(diào)試都沒辦法。
這下,我想徹底放棄 RTD 了。

于是最近花了好幾天,一直在忙一件事,就是把之前的五個在線文檔,全部脫離 RTD 部署到自己的個人服務(wù)器上。
相信這兩天,有在看那幾個在線文檔的朋友,應該有遇到間斷性不能訪問的問題吧?
沒錯,是我搞的鬼。
但是現(xiàn)在已經(jīng)經(jīng)全部遷移完成,大家可以正常訪問。
遷移到自己的服務(wù)器,主要為了方便以后對網(wǎng)站做 SEO 優(yōu)化,但是脫離 RTD 后,又帶來了不少的問題,也把我搞得非常頭疼,花了很久的時間才搞定,這些問題我也都記錄下來了。后面會繼續(xù)分享出來。
今天這篇文章主要分享 給文章上 https 的事情。
想直以前搭建個人網(wǎng)站的時候,使用的是寶塔里申請的免費證書。
但現(xiàn)在去看了下,已經(jīng)沒有免費證書可以用了。
于是,我回想起之前發(fā)文章的時候,有人在底下評論說 certbot 也是免費,非常推薦。

報著試試看的態(tài)度,去嘗試了下,沒想到發(fā)現(xiàn)這貨還真不錯,值得我寫一篇文章來介紹一下它。
這樣的感覺真的很好,在我給大家分享的同時,有些讀者能夠在留言區(qū)提供一些意見,有的是獨到的見解,有的是更優(yōu)解,我的讀者雖然不是很多,但是每次也有好幾千人可能看到,所以希望大家,不要吝嗇自己的發(fā)言,要多多留言啊。
# 1. 安裝 certbot
以前安裝 certbot 有一個叫做 certbot-auto 的腳本工具,但這個工具由于是用 python2 編寫的,pythoh2 不維護后,官方也放棄了那些默認使用 python2 為默認 Python 的操作系統(tǒng)。
沒有了那個certbot-auto,雖然會麻煩一些,但好在官方給的文檔非常全,一般也不會有什么問題,具體可以去官方查看。
下面是我在 CentOS 7.2 上的安裝 方法,供你參考。
第一步:安裝 snapd,并啟動它。
# https://snapcraft.io/docs/installing-snap-on-red-hat
sudo yum -y install snapd
sudo systemctl enable --now snapd.socket
sudo systemctl start --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap
sudo snap install core; sudo snap refresh core
第二步:使用 snap 安裝 certbot(如果你在此之前有使用系統(tǒng)自帶的包管理器安裝過 certbot,那么請你先卸載它)
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
# 2. 使用 certbot
有了 certbot 就可以用來申請證書、續(xù)費證書、部署證書了。
1、申請證書
使用如下 certbot 命令就可以開始證書的申請。以下自動完成申請,需要替換郵箱及自己的域名:
certbot --nginx --agree-tos --redirect \
-m [email protected] --eff-email \
--preferred-challenges http-01 \
--cert-name url.com \
-d url.com,xyz.url.com,www.url.com -q
前提你得提前安裝 nginx (這個自然不用說),安裝過了但路徑不對的話,需要你建立一個軟鏈接
ln -s /usr/local/nginx/conf/ /etc/nginx
2、續(xù)期證書
certbot 的證書有效期是 3個月(準確的說應該是 90 天),這意味著你 3個月就要來處理一下續(xù)期。
續(xù)期的命令就比較簡單了。
certbot renew
# 3. 難用的 certboot
使用 cerbot 申請證書的時候,有許多交互界面需要你填入各種參數(shù),允許各種協(xié)議,體驗非常的不好。
并且最主要的是,在證書的申請和續(xù)期的過程中,有一步需要驗證你對該域名的所有權(quán),因此需要你人工登陸你域名提供商的控制臺去添加類型為 txt 的 DNS 記錄。
這導致了整個過程非常的繁瑣,需要全程人工的界入。
而這繁瑣的過程,不僅在你申請證書的時候要來一次,以后續(xù)費每次都要重復操作。
雖然各大國內(nèi)域名提供商提供了 API 接口,可以讓開發(fā)者調(diào)用去管理域名的 DNS 解析。
但 certbot 本身并未實現(xiàn)這個功能,這非常的遺憾。
# 4. 好用的 letscertbot
但慶幸的是,certbot 的流程中保留了不少的 hook,開發(fā)者可以自行實現(xiàn) DNS 的驗證邏輯。
于是乎,就出現(xiàn)了一些有心的開發(fā)者,花時間寫一些腳本,結(jié)合 certbot 來實現(xiàn)更多智能的工作。
在早期,有一個叫做 certbot-letencrypt-wildcardcertificates-alydns-au 在 github 項目,是基于 certbot-auto 的腳本。
之前不知道 certbot-auto 已經(jīng)廢棄了,讓我試了半天,一直提示失敗。
結(jié)果去 issue 上看,很多 issue 都沒有處理,作者也已經(jīng)一年沒有在 github 上活躍過了。也許該項目是已經(jīng)和 certbot-auto 的廢棄而告終了。
于是我又開始漫天尋找新的解決方案。
終于讓我找到一個叫 letscertbot 的項目。

# 5. 好用 letscertbot
使用letscertbot 的方法有兩種
使用容器運行
使用腳本運行
我這里使用腳本運行演示。
在開始使用之前,你需要拷貝模板配置文件,并進行配置
cp config.json.example config.json
主要配置的項有:
base.email:填寫你的郵箱,以便接收通知dns.aliyun:填寫你的阿里云(如果你用的是阿里云域名的話)的授權(quán)id和密鑰
阿里云的授權(quán)id怎么獲取呢?
可前往阿里云的幫助文檔:https://help.aliyun.com/knowledge_detail/38738.html
接下來我們就可以:
1、申請證書
申請的證書全部在 /etc/letsencrypt/live/ 目錄下
sudo python ./bin/obtain.py -d your.example.com *.your.example.com
2、續(xù)費證書
sudo python ./bin/renewal.py
然后你可以將該命令部署到 cron 定時任務(wù)中,這個計劃任務(wù)將每 7 天執(zhí)行 renewal 腳本。
0 0 */7 * * sudo $your_letscertbot_home/bin/renewal.py > /var/log/letscertbot-renewal.log 2>&1
如果你需要強制為指定的證書續(xù)期,可以提供 --force and --certs 參數(shù):
sudo python ./bin/renewal.py --certs xny.example.com --force
3、部署證書
如果你將 deploy.server.enable 設(shè)置為 true, Certbot 將執(zhí)行 deployment 腳本 (deploy.py) 在 deploy 鉤子上。這個腳本接收到已經(jīng)續(xù)期的證書并將它推送到配置好的服務(wù)器中。
Let's Certbot 通過 SSH 為遠程服務(wù)器部署證書,這意味著你執(zhí)行 Certbot 的機器須通過 SSH 連接上遠程服務(wù)器。為了使連接成功,你需要上傳公鑰到遠程服務(wù)器或者提供 deploy.server.password 給 sshpass 工具。
此外,為了將證書部署到 deploy.server.deploy_to 或重啟 nginx, Let's Certbot 要求 deploy.server.user 有執(zhí)行對應操作的權(quán)限。
你可以通過執(zhí)行下面命令獲取 deployment 腳本:
sudo python ./bin/deploy.py --check
如果需要推送證書到配置中的服務(wù)器,可以執(zhí)行:
sudo python ./bin/deploy.py --push --cert $certificate_name --server $server_host
至此,我已經(jīng)把 cerbot 和 letscertbot 的使用全部寫明白了,強烈推薦大家要申請證書的時候,用起來了。
