443端口不知道是電信不想封還是怎么樣,一直無需備案就能開啟對外服務。而443端口就必須使用合法的 SSL 證書,合法的 SSL 證書很多,我一直在使用 letsencrypt 提供的SSL證書服務。但是 letsencrypt 的證書只有90天的有效期,必須在有效期內 renew,否則過期了只好重新申請了。申請 letsencrypt 證書網上一堆都是需要開放 80 端口才能申請,其實 CertBot 在以前就是支持 https 的方式申請證書。但是不知道什么原因放棄了. 現在另外一方法是用dns申請和更新. 我的域名是掛在dnspod下面的, 需要用到dnspod的接口去更新txt記錄才能正常的更新證書.
安裝certbot
centos 7
yum install epel-release
yum install certbot
ubuntu
可以先嘗試執行sudo apt-get install certbot 看是否能安裝. 如果提示找不到的話, 執行下面的命令后再嘗試安裝
sudo add-apt-repository -y ppa:certbot/certbot sudo apt-get update
然后執行sudo apt-get install certbot
DNS認證
letsencrypt支持使用DNS認證的方式來獲取證書,這種方式需要在DNS里面添加TXT記錄來證明域名是你自己的。
這種方式只能使用certonly功能,因此安裝時需要自己修改相應的服務器配置,無法讓certbot幫忙修改。
只需要運行一下命令即可,
1 |
sudo certbot certonly --manual --preferred-challenge dns -d <你的域名> |
然后首先會告知你會記錄你的IP,選擇Y,接着會出現一個提示,要你把_acme-challenge.<你的域名>設置成TXT記錄,值也會寫出來,設置好以后等待生效回車即可。
成功以后,就會告訴你證書路徑,只需要替換掉服務器的配置里面的證書即可。
證書更新
使用dns申請的證書是沒辦法直接使用certbot renew來更新證書的. 幸虧 cerbot 提供了一個 manual-auth-hook hook,什么意思呢?可以編寫一個腳本,由這個腳本來先完成 DNS 驗證,然后再進行 renew。對應的腳本會自動添加 DNS 記錄,從而完成 DNS 校驗,並自動 renew 證書。寫了個腳本進行更新au.sh, 代碼如下:
-
echo "recode:"$CERTBOT_VALIDATION
-
-
curl -k https://dnsapi.cn/Record.Modify -d "login_email=${ACCOUNT}&login_password=${PASSWORD}&domain_id=${DOMAIN_ID}&record_id=${REC_BBS}&sub_domain=_acme-challenge.${RECORD}&record_line=默認&record_type=TXT&value=$CERTBOT_VALIDATION"
-
-
sleep 20
關於如何查詢domain_id 和record_id
-
#獲得域名id
-
#curl -k https://dnsapi.cn/Domain.List -d "login_email=${ACCOUNT}&login_password=${PASSWORD}"
-
#獲得域名id下的記錄列表
-
#curl -k https://dnsapi.cn/Record.List -d "login_email=${ACCOUNT}&login_password=${PASSWORD}&domain_id=${DOMAIN_ID}"
測試
certbot renew --manual-auth-hook /root/au.sh --dry-run
重要提醒:為避免遇到操作次數的限制,加入 dry-run 參數,能夠避免操作限制,等執行無誤后,再進行真實的renew 操作。
出現以上信息的時候就表示成功了.
然后加到crontab里面
30 0 * * 1 certbot renew --manual-auth-hook /root/au.sh
表示每周一凌晨0點30分會嘗試更新證書.
感謝以下3位作者提供的參考:
https://www.orzorc.com/201807/get-cert-by-letsencrypt-dns-challenge/
