目录

在没有开通 80 端口的情况下申请letsencrypt.org 的免费 ssl 证书。Apply letsencrypt.org ssl certificates without 80 port

在没有开通 80 端口的情况下申请letsencrypt.org 的免费 ssl 证书。

install certbot

安装certbot

centos 7

1
2
3
yum install epel-release

yum install certbot

ubuntu

可以先尝试执行sudo apt-get install certbot 看是否能安装. 如果提示找不到的话, 执行下面的命令后再尝试安装

1
2
3
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记录,值也会写出来,设置好以后等待生效回车即可。

通过一下 url 检查是否生效:

https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.<YOUR_DOMAIN>

成功以后,就会告诉你证书路径,只需要替换掉服务器的配置里面的证书即可。

证书更新

使用dns申请的证书是没办法直接使用certbot renew来更新证书的. 幸亏 cerbot 提供了一个 manual-auth-hook hook,什么意思呢?可以编写一个脚本,由这个脚本来先完成 DNS 验证,然后再进行 renew。对应的脚本会自动添加 DNS 记录,从而完成 DNS 校验,并自动 renew 证书。写了个脚本进行更新au.sh, 代码如下:

1
2
3
4
5
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=默认&recotype=TXT&value=$CERTBOT_VALIDATION"
 
sleep 20

关于如何查询domain_id 和record_id

获得域名id\域名id下的记录列表
1
2
3
4
#获得域名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}"

测试

1
certbot renew --manual-auth-hook /root/au.sh --dry-run

重要提醒:为避免遇到操作次数的限制,加入 dry-run 参数,能够避免操作限制,等执行无误后,再进行真实的renew 操作。出现"all renewals successed"以上信息的时候就表示成功了.

然后加到crontab里面

1
30 0 * * 1 certbot renew --manual-auth-hook /root/au.sh

表示每周一凌晨0点30分会尝试更新证书.