banner

折腾Let's Encrypt免费通配符证书的自动更新

Let's Encrypt免费证书我想大家应该不陌生了;

最近几年的免费证书,基本上都是Let's Encrypt和Symantec的免费证书,被拉黑的其它免费证书就不谈了;

赛门铁克(Symantec)的免费证书代理发布在服务运营商手中,所以大家都需要去单独填表申请,还要手动设置dns(阿里云账号一体的可以自动设置)。不过流程并不算复杂,基本上一天内都能拿到证书。

Let's Encrypt的免费证书,是按照安全规范,每次签发有效期为三个月的证书;这两年的工具云集,而大家手上常用的,基本上就是acme.sh和certbot了。

我的博客一直是用Let's Encrypt证书,早期使用acme.sh初期版本,各种折腾;后来发现了更加快捷方便的certbot;至于证书的更新,基本上都是手动renew...虽然可以设置定时任务,但使用域名+ip的验证方法,需要停443端口的占用;使用DNS的方法,DNS的TXT记录有可能会出现更新。。。真是烦躁;后来也懒得去折腾其它的自动更新证书方案;

早在去年就听说Let's Encrypt会在2018年推出通配符证书,就一直在等今年推出新的方案以后,把证书更新的方案改了。

什么是通配符证书?

话题就要说到,Let's Encrypt证书和其它免费证书的区别。

例如赛门铁克的免费证书是单域名证书,就是只能申请一个主机域名;附赠www的主机名,例如申请domain.com的证书,会有备用的www.domain.com;如果abc.domain.com域名使用这个证书,就会导致签名验证失败,浏览器不能正常访问网站。

而Let's Encrypt的免费证书是多域名证书,只需要在申请时,将想要一起签名的域名设置到配置中即可。

而通配符证书,我们只需要设置一个*.domain.com域名,那么之后的a.domain.com,b.domain.com等等,都可以使用这个证书进行加密;

回到文章想说的话题,其实在通配符证书上线前,acme.sh已经推出了基于DNS服务器API,自动更新DNS记录和自动更新证书的方案。但我没有去折腾,直到最近才看到lnmp一键包推出了自动更新通配符证书的方案,我才开始准备折腾。

关于lnmp一键包的自动更新方案是属于lnmp一键包环境下的,所以我这里不细谈这个折腾的过程,因为lnmp的集成,这个操作韩式蛮简单的。戳这里查看相关教程

因为有一些环境,我并没有采用lnmp一键包,所以我根据教程中提到的acme.sh,折腾了一下。


PS:我的运行环境是ubuntu 16.04,不代表大家都是一样的效果。

官方中文文档:https://github.com/Neilpang/acme.sh/wiki/说明 

第一步,下载脚本;

curl https://get.acme.sh | sh

安装脚本时会出现个别情况,例如提示openssl没有安装,执行相关语句安装即可;例如apt install openssl

进入下载的脚本文件夹,按照官方中文文档的提示,我们创建一个bash命令的别名;

cd ~/.acme.sh/
alias acme.sh=~/.acme.sh/acme.sh

【最新情况,新版本的脚本自动安装,可以省去别名操作】


第二步,生成证书;

在生成证书前,设置对应dns服务商的api授权配置;

可以在这个链接查找对应的dns服务商:https://github.com/Neilpang/acme.sh/tree/master/dnsapi 

例如,我是阿里云的dns,先在bash里面通过export设置;

export Ali_Key="xxx"
export Ali_Secret="xxx"

其中的xxx自行替换成对应的内容。

acme.sh --issue --dns dns_ali -d domain.com

如果key和secret没有问题,就会执行一个120秒的等待生效时间。

申请成功示意图


第三步,安装证书;

基于acme.sh的开发规划,默认生成的证书是可能会出现目录结构变化的,所以需要将证书自动安装到对应文件夹。

目录的设计根据自己的需求来确定,acme.sh提供的脚本没有自动mkdir,需要手动创建出对应目录。

acme.sh --installcert -d domain.com \
        --key-file /home/ssl/domain.com/domain.com.key \
        --fullchain-file /home/ssl/domain.com/fullchain.cer \
        --reloadcmd "service nginx reload"

最后的reloadcmd里面,service nginx reload在我版本中是可以生效的,部分版本需要使用service nginx force-reload;大家配完证书自己测试,按需使用;

第四步,部署证书;

证书的部署,根据不同的web服务器,有不同配置方法;

我给一个nginx的证书配置例子,没有加入HSTS的,安全评级在A的样子。

server
    {
        listen 443 ssl http2;
        ssl                          on;
        server_name                  domain.com;
        server_tokens                off;
        
        ssl_certificate              /home/ssl/domain.com/fullchain.cer;
        ssl_certificate_key          /home/ssl/domain.com/domain.com.key;
        
        ssl_ciphers                  EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256::!MD5;
        ssl_protocols                TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers    on;
        ssl_session_cache            builtin:1000 shared:SSL:10m;
        ssl_session_timeout          1d;
        ssl_session_tickets          on;
        
        location / {
            proxy_http_version       1.1;
            proxy_ignore_headers     Set-Cookie;
            proxy_pass               http://127.0.0.1:8081;
        }
    }

配置仅供参考,不代表运行就可以使用,是否采用反向代理,根据自己的情况定夺。

阅读: 5051
在同意共创许可协议(CC BY-NC-SA-4.0)的前提下,您可以转载本文。
橙色阳光
https://oss.so/article/98

相关阅读

留言评论

暂无留言