Certbot 生成 SSL 证书并配置自动续期
1、背景
刚来到公司的时候开发同事给我讲了一个事,因为公司开发的项目没有专人管理,只是开发组长一直在兼任管理服务器和相关资源,根本就整不过来,经过我在这干的两个月发现这些开发和测试也不愿意稍微多干一点,毕竟工资也在这放着的,然后就出事了,因为没有做业务的相关监控,所以对证书的过期时间都不知道。代码里面又调用了域名,结果直接爆雷了,业务直接断了整个it部门全部都扣工资了,而且公司的子域名也很多,直接买第三方的证书也很贵,正好有天和同事聊了一下告诉我可以用certbot生成。
2、Certbot使用
https://certbot.eff.org/instructions?ws=nginx\&os=centosrhel7
在certbot的官网上有一些简单的使用方法,都是英文看着也不方便所以手册啥的也没找直接找的帖子,这篇内容使用的配置服务都是nginx,先说一下简单的使用方法(参考官网是一样的),还支持测试生成,在生成命令后面添加 --dry-run 参数就可以先测试是否可以生成证书,报红的话就是失败了,先别按着下面这个直接生成,先测试,测试完了可以先看看下面自动续期,生成之后服务器会记录就麻烦了
bash
1、安装snap(不要问我为什么用sudo,没转正呢不给权限,装装样子(*^%$#*&*()*&%)^&$&^)
sudo yum install -y epel-release snapd
sudo systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap
2、安装certbot
sudo snap install --classic certbot
#如果提示error: too early for operation, device not yet seeded or device model not acknowledged,则重新登录服务器然后等一会,或者查看是否开启selinux,这个需要关闭。
sudo ln -s /snap/bin/certbot /usr/bin/certbot
3、获取并安装SSL证书
sudo certbot --nginx
#运行此命令获取证书,并让Certbot自动编辑您的nginx配置以提供证书,在一个步骤中打开HTTPS访问。
sudo certbot certonly --nginx
#如果你感觉更保守,只需要证书。其他想手工修改nginx配置,运行这个命令
#期间需要输入邮箱地址用于紧急续订和安全通知以及需要同意服务条款(这个邮箱配真实的最好),以及选择哪一个域名配置SSL证书
4、查看证书
certbot certificates
#自此,证书申请成功,并自动配置到nginx中,并且Certbot已设置了一个计划任务,以便在后台自动续订此证书
但是上面生成方法只适用于本地有安装nginx服务的环境,可以自动识别配置并写入匹配规则。像我现在公司用的就不支持,都是用的docker跑的微服务,前后端分离都需要添加证书,直接在服务器上生成是找不到配置的,会报错,在容器里面生成就有点扯淡了。
下面说下怎么在本地没有nginx环境的配置方法,只要通外网能使用certbot就都能生成证书,这个工具需要python环境支持,有时候安装会报错需要在找一些其他文章。
这个方法思路是没有问题的,因为之前申请过了服务器有记录了,所以就无法测试了,我这是使用的阿里云,所以下面这个方法是通过阿里云实现的,其他的云厂商也是一样的,需要在厂商的dns解析。
bash
1、获取阿里云的ak
#我这里就不创建新的账号指定权限了,这块只需要点点点,阿里云上有手册
登录账号后,右上角头像第三行有个 AccessKey 管理 点进去之后创建一个 AccessKey ,创建之后保存好后面用,关闭之后可就没了要重新创建
2、安装阿里控制台工具
sudo wget https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz
sudo tar xzvf aliyun-cli-linux-latest-amd64.tgz
sudo sudo cp aliyun /usr/local/bin
sudo rm aliyun
3、配置权限
aliyun configure --profile akProfile#配置会进入交互式内容,如下输入完成配置
Configuring profile 'akProfile' in '' authenticate mode...
Access Key Id []: 在这里输入刚新建角色的 Access Key 然后回车进入下一项
Access Key Secret []: 在这里输入刚新建角色的 Access Key Secret 然后回车进入下一项
Default Region Id []: cn-hangzhou #这个ID需要去阿里云上获取一下,下面网址
#https://help.aliyun.com/zh/ecs/product-overview/regions-and-zones
Default Output Format [json]: json (Only support json))
Default Language [zh|en] en:
Saving profile[akProfile] ...Done.
#配置成功下面会出现一个字符画的阿里云log
4、安装 certbot-dns-aliyun 插件
wget http://cdn.jsdelivr.net/gh/justjavac/certbot-dns-aliyun@main/alidns.sh
sudo cp alidns.sh /usr/local/bin
sudo chmod +x /usr/local/bin/alidns.sh
sudo ln -s /usr/local/bin/alidns.sh /usr/local/bin/alidns
rm alidns.sh
5、测试申请
certbot certonly -d *.替换自己的域名.com --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --dry-run
#这里是申请的通配符证书
certbot certonly -d *.example.com --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean"
#测试没问题可以使用这个
certbot renew --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --dry-run
#证书续期
上面这个要是测试没问题的话,添加一个定时任务就可以用了。但是我这个情况有点特殊,部署nginx的主安装不上certbot显示python报错,但是生产环境不能瞎搞所以只能在其他的机器生成然后远程拷贝到这台机器上,因为之前生成过指定子域名的证书,所以生成通配符的证书一直不行,而且之前都是每个子域名单独生成的,一时半会改不了,然后就一直没法测试,写了一个脚本可以试一下,也不难自己读一下很快。
bash
#!/bin/bash
#author:dragon_qu
#describe:Certificate automatic renewal
certbot renew --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --dry-run
ip=111.111.111.111
# 定义公共的源和目标根目录
src_root="/etc/letsencrypt/live"
target_root="/etc/nginx/conf.d/certs"
# 定义要复制的文件
files=("fullchain.pem" "privkey.pem")
# 定义目标文件名
target_files=("ssl.pem" "ssl.key")
# 读取配置文件并处理每个目录的映射
while IFS=',' read -r src_dir target_dir; do
# 跳过空行和注释行
[[ -z "$src_dir" || "$src_dir" =~ ^# ]] && continue
# 循环复制每个文件,并重命名
for i in ${!files[@]}; do
scp "$src_root/$src_dir/${files[$i]}" "$ip:$target_root/$target_dir/${target_files[$i]}"
done
done < domain_mapping.txt#这个文件有个格式
#这个文件放同级目录就行,左边是泛域名的目录名称,右边是子域名的目录名称
#test.dragon.com,abc.test.dragon.cn
#test.dragon.com,gfs.test.dragon.cn
#dragon.com,www.dragon.cn
#dragon.com,aaa.dragon.cn
#dragon.com,bbb.dragon.cn
# 确认复制结果,输出到当前目录
ssh $ip "ls -l $target_root/*" > ./result.txt