SSL证书自动生成并自动续期
自动续期使用Let’s Encrypt
证书颁发机构和certbot
客户端共同完成
Let’s Encrypt
Let’s Encrypt 是一家免费、开放、自动化的证书颁发机构(CA),为公众的利益而运行。它是一项由 Internet Security Research Group(ISRG)提供的服务。我们以尽可能对用户友好的方式免费提供为网站启用 HTTPS(SSL/TLS)所需的数字证书。这是因为我们想要创建一个更安全,更尊重隐私的 Web 环境。
Certbot介绍
Certbot 是 Let’s Encrypt CA(或使用 ACME 协议的任何其他 CA )的功能全面,可扩展的客户端,可以自动执行获取证书和配置 Web 服务器以使用证书的任务
申请ssl证书
下载certbot
百度文章很多,自行百度适合自己的操作系统对应的版本
申请证书
非泛域名
申请证书
使用webroot(其他几种方式大同小异standalone、manual,据说nginx插件方式很好用,还没有尝试过)的方式认证,即certbot会自动在web服务器的根目录下生成一个密钥文件,并通过==http(需要开放80端口)==的方式访问该域名下的该密钥文件
certbot certonly --webroot -w /root/appenv/docker/sclf-general/sclf-general-web-nginx/html -d jcps.sclf.top -d oss.sclf.top -d preview.sclf.top --force-renew
–webroot:指定方式
-w:指定域名的根目录
-d:指定域名
–force-renew:强制生成新的证书
命令执行后注意看日志,会告诉你证书保存在了哪个地方
nginx使用证书
修改nginx配置
server {
listen 443 ssl;
server_name 域名;
ssl_certificate /xxx/fullchain.pem;
ssl_certificate_key /xxx/privkey.pem;
}
证书续期脚本
使用certbot renew
命令就可以直接将证书进行续期
编写自动续期的脚本
#!/usr/bin/env bash
echo start renew
certbot renew --force-renewal
echo finish renew
echo start find nginx container id
nginx_container_id=$(docker ps -a | grep sclf-general-web-nginx |cut -d ' ' -f1)
echo nginx_contain_id : $nginx_container_id
echo start reload nginx
docker exec $nginx_container_id nginx -s reload
echo finish reload nginx
我这里将nginx运行在docker中,所以需要找到docker中的nginx容器的id,然后在容器中让nginx对配置文件进行重新加载
解析来配合linux的定时任务定期执行该脚本即可自动完成续期
linux定时执行脚本
使用crontab在linux系统上执行定时任务,如未安装自行百度(一般情况centos默认安装了)
crontab -e
进入定时任务编辑页面,添加如下内容
0 0 1 */3 * sh /root/appenv/docker/sclf-general/sclf-general-web-nginx/ssl-renew.sh >> /root/appenv/docker/sclf-general/sclf-general-web-nginx/ssl-renew-log/$(date +"\%Y-\%m-\%d")-output.log 2>&1
表示每3个月的1日0点0分执行脚本
具体表达式可以在线进行修改,https://www.matools.com/crontab
泛域名
只能使用dns解析的方式认证
结合上述内容以及以下github项目即可完成
思路:对接各个平台的dns解析服务api,使用cerbot自带的钩子完成
https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au
项目有点时间没有更新了,api有问题,可以自己更新python脚本对接最新的平台api
后面有时间再补充