在网上寻找解决80端口问题的时候,发现Let’s Encrypt还可以通过验证DNS来签发证书,这里我用的是GitHub上开源的acme.sh程序。详细的使用方法可以查看WIKI。我的域名解析放在dnspod,正好支持,使用nginx举例。
安装acme.sh
acme不需要安装certbot,都是用shell脚本编写,功能强大。
git clone https://github.com/Neilpang/acme.sh.git cd acme.sh/ ./acme.sh --install --home /root/jobs/acme --certhome /root/jobs/acme/cert_tmpdir
添加dnspod的token信息
首先登陆DNSPod,在“用户中心”——“安全设置”中为acme.sh添加独立的Token。
用ID和Token替换下面这个命令中的DNSPod的ID和DNSPod的Token。
echo -e "DP_Id=\"DNSPod的ID\"\nDP_Key=\"DNSPod的Token\"\n" \ >>/root/jobs/acme/account.conf
在运行acme.sh时会自动调取Token信息进行签发。
签发证书
例如:
/root/jobs/acme/acme.sh --issue --dns dns_dp -d mail.nbqykj.cn --force --debug
–force和–debug是可选项,可以一次为一个主域名和多个二级域名签发证书,无法签发通配符证书。
安装证书
上步签发的证书是在/root/jobs/acme/cert_tmpdir 临时目录里,不建议nginx或者apache直接使用该目录。而是复制到指定的固定目录,例如我的nginx目录:/usr/local/nginx/conf/ssl ;
例如:
/root/jobs/acme/acme.sh --installcert -d mail.nbqykj.cn --keypath /usr/local/nginx/conf/ssl/mail.nbqykj.cn.key --fullchainpath /usr/local/nginx/conf/ssl/mail.nbqykj.cn.cer
然后在nginx的网站配置文件中添加以下两行。
ssl_certificate ssl/mail.nbqykj.cn.cer ; ssl_certificate_key ssl/mail.nbqykj.cn.key ;
重启nginx
service nginx force-reload
计划任务
默认acme.sh安装完成后会在当前用户下创建crontab,类似如下:
46 0 * * * "/root/jobs/acme"/acme.sh --cron --home "/root/jobs/acme" > /dev/null
我自己把这个计划任务改成上面的步骤了。
例如:
/root/jobs/acme/acme.sh --issue --dns dns_dp -d mail.nbqykj.cn /root/jobs/acme/acme.sh --installcert -d mail.nbqykj.cn --keypath /usr/local/nginx/conf/ssl/mail.nbqykj.cn.key --fullchainpath /usr/local/nginx/conf/ssl/mail.nbqykj.cn.cer /etc/init.d/nginx reload
参考:https://blog.atomur.com/2017-01-18/use-the-acme-sh-to-issue-the-letsencrypt-certificate-for-the-domain-name-without-80-port/