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秒的等待生效时间。【新版本有变化,等待时间根据不同API而不同】
申请成功示意图
第三步,安装证书;
基于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; } }
配置仅供参考,不代表运行就可以使用,是否采用反向代理,根据自己的情况定夺。