通过 saltstack 批量更新 SSL 证书

本文涉及的产品
.cn 域名,1个 12个月
日志服务 SLS,月写入数据量 50GB 1个月
简介: 通过 saltstack 批量更新 SSL 证书

哈喽大家好,我是咸鱼。

之前写过两篇关于 SSL 过期巡检脚本的文章:

  1. SSL 证书过期巡检脚本
  2. SSL 证书过期巡检脚本(Python 版)

这两篇文章都是讲如何通过脚本去自动检测 SSL 过期时间的,当我们发现某一域名的 SSL 证书过期之后,就要及时更换。

如果这个域名下有很多服务器,我们一台一台手动登录机器然后更新证书的话效率是非常低的,所以我们可以通过一些自动化运维工具去完成这些大量重复的工作。

像 ansible、puppet 这类工具也可以实现同样的效果,但是咸鱼这边主要用的还是 saltstack,所以今天介绍一些如何通过 saltstack 去批量更新 SSL 证书。

关于 saltstck 的介绍:

  1. 干货篇 | 自动化运维工具-saltstack(上)
  2. 干货篇 | 自动化运维工具-saltstack(中)
  3. 干货篇 | 自动化运维工具-saltstack(下)

首先我们在 salt-master 的主目录下创建一个新的目录,用于存放 SSL 证书和脚本,我自己机器上的 master 主目录为 /home/salt/

mkdir -pv /home/salt/ssl_update/ssl

然后把 SSL 证书放在 /home/salt/ssl_update/ssl 目录下,如果有多个域名的话需要在下面创建多个对应的目录

[root@localhost]# tree /home/salt/ssl_update/
/home/salt/ssl_update
├── rollback.sls
├── update.sls
├── ssl
│   ├── domain1
│   │   ├── server.key
│   │   └── server.pem
│   ├── domain2
│   │   ├── server.key
│   │   └── server.pem
│   └── domain3
        ├── server.key
        └── server.pem

接下来我们开始编写 saltstack 状态脚本:

  1. update.sls 负责更新证书
  2. rollback.sls 负责回滚证书

因为之前遇到过更新证书之后由于证书链不完整导致证书失效,然后不得不紧急手动还原之前的证书。

所以觉得有必要做一个回滚操作,这样新证书有问题的时候能够及时自动还原。

我们先来看一下负责更新证书的 update.sls,这个脚本分成了三个模块:

  1. SSL 证书备份
  2. SSL 证书更新
  3. Nginx 重启
{
   % set domain = 'doamin1' %}
{
   % set ssl_dir = '/usr/local/nginx/ssl' %}
{
   % set dst_dir = ssl_dir + '/' + domain %}
{
   % set bak_dir = '/opt/backup/ssl/' + domain %}

backup_ssl:
  cmd.run:
      - name: "year=$(openssl x509 -in {
     {
      dst_dir }}/server.pem -noout -dates|grep Before|awk '{
     print $4}') && mkdir -p {
   { bak_dir }}/${year} && \\cp {
   {dst_dir}}/* {
   { bak_dir }}/${year}"

ssl_update:
  file.recurse:
    - source: salt://ssl_check/ssl/{
   {
   domain}}
    - name: {
   {
    dst_dir }}
    - require:
      - cmd: backup_ssl


nginx_reload:
  cmd.run:
    - name: /usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload
    - require:
      - file: ssl_update

首先是变量的定义

{
   % set domain = 'doamin1' %}
{
   % set ssl_dir = '/usr/local/nginx/ssl' %}
{
   % set dst_dir = ssl_dir + '/' + domain %}
{
   % set bak_dir = '/opt/backup/ssl/' + domain %}
  • domain: 设置域名为 'doamin1'
  • ssl_dir: 设置 SSL 证书存放目录为 '/usr/local/nginx/ssl'
  • dst_dir: 设置 SSL 证书实际存放路径为 ssl_dir + '/' + domain
  • bak_dir: 设置备份目录为 '/opt/backup/ssl/' + domain

然后就是 SSL 证书备份。首先创建名为 backup_ssl 的命令执行模块,通过 cmd.run 执行 shell 命令,这个命令通过 OpenSSL 获取证书的有效期限,然后将证书拷贝到备份目录,以年份为子目录。

backup_ssl:
  cmd.run:
      - name: "year=$(openssl x509 -in {
     {
      dst_dir }}/server.pem -noout -dates|grep Before|awk '{
     print $4}') && mkdir -p {
   { bak_dir }}/${year} && \\cp {
   {dst_dir}}/* {
   { bak_dir }}/${year}"

这条命令看着很长,其实可以拆解成

# 获取证书有效期限然后赋值给 year 变量
year=$(openssl x509 -in {
   {
    dst_dir }}/server.pem -noout -dates|grep Before|awk '{print $4}')

# 创建带年份后缀的备份目录
mkdir -p {
   {
    bak_dir }}/${year} 

# 把当前的证书备份到备份目录中
cp {
   {
   dst_dir}}/* {
   {
    bak_dir }}/${year}

接着我们开始更新 SSL 证书。创建名为 ssl_update 的文件递归模块,然后通过 file.recurse 把 salt-master 上的证书复制到指定服务器目录

ssl_update:
  file.recurse:
    - source: salt://ssl_check/ssl/{
   {
   domain}}
    - name: {
   {
    dst_dir }}
    - require:
      - cmd: backup_ssl

更新完之后我们还要对指定服务器上的 Nginx 服务进行配置检查并重启一下

nginx_reload:
  cmd.run:
    - name: /usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload
    - require:
      - file: ssl_update

然后我们看一下负责回滚证书的 rollback.sls,这个脚本分成了两个个模块:

  1. 证书回滚
  2. Nginx 重启
{
   % set domain = 'doamin1' %}
{
   % set ssl_dir = '/usr/local/nginx/ssl' %}
{
   % set dst_dir = ssl_dir + '/' + domain %}
{
   % set bak_dir = '/opt/backup/ssl/' + domain %}
{
   % set year = salt['pillar.get']('year') or salt['cmd.run']('echo $(date +%Y) - 1| bc') %}


rollback:
  cmd.run:
    - name: "cp {
   { bak_dir }}/$(({
    { year }}))/* {
   { dst_dir }}"

start:
  cmd.run:
    - name: /usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload
    - require:
      - cmd: rollback

设置变量 year 的命令有点复杂,我们来看一下

{
   % set year = salt['pillar.get']('year') or salt['cmd.run']('echo $(date +%Y) - 1| bc') %}
  1. salt['pillar.get']('year'): 尝试从Salt Pillar 中获取名为 year 的变量的值。
  2. or: 如果前面的操作未成功(即 year 在 Pillar 中不存在),or 后面的表达式将会被执行。
  3. salt['cmd.run']('echo $(date +%Y) - 1| bc'): 这部分代码使用 SaltStack 的 cmd.run 模块执行一个 shell 命令,该命令通过 date 命令获取当前年份,然后减去 1 得到前一年的年份。bc 是一个计算器工具,用于执行数学运算。
  4. 总结一下:首先从 Salt Pillar 中查找,如果找不到则使用 shell 命令获取前一年的年份,确保在没有 Pillar 配置的情况下也有一个默认的年份

然后就是 SSL 证书回滚。创建名为 rollback 的命令执行模块,通过 cmd.run 执行 shell 命令

该命令通过将指定服务器备份目录中指定年份的证书拷贝到 SSL 证书目录实现回滚。

rollback:
  cmd.run:
    - name: "cp {
   { bak_dir }}/$(({
    { year }}))/* {
   { dst_dir }}"

回滚完之后对指定服务器上的 Nginx 服务进行配置检查并重启一下,上面内容有,这里就不再介绍了。

相关实践学习
基于函数计算快速搭建Hexo博客系统
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
9天前
|
安全 网络安全
如何给网站添加ssl安全证书
如何给网站添加ssl安全证书
24 1
|
1月前
|
安全 搜索推荐 数据建模
解决网站“不安全”、“不受信”、“排名下降”,你需要——「SSL证书」
SSL证书是网络安全的关键,用于加密和验证网站身份,保护用户数据安全,防止信息被窃取。它分为DV、OV、EV和IV四种类型,每种验证网站身份的程度不同。DV证书快速签发,OV和EV证书提供更高级别的身份验证,EV证书曾在浏览器地址栏显示绿色。目前,DV证书占据市场大部分份额。SSL证书还有单域、通配符和多域之分,有效期曾从多年逐渐缩短至90天,以增强安全性。部署SSL证书能提升用户信任,优化SEO排名,并符合网络安全法规要求。
解决网站“不安全”、“不受信”、“排名下降”,你需要——「SSL证书」
|
1月前
|
存储 算法 安全
ssl 证书名词解释--crt和pem
ssl 证书名词解释--crt和pem
146 0
|
1月前
|
Linux 应用服务中间件 网络安全
linux ssl 证书 --本地制作数字证书并进行程序的数字签名
linux ssl 证书 --本地制作数字证书并进行程序的数字签名
34 0
|
1天前
|
前端开发 小程序 应用服务中间件
在服务器上正确配置域名https证书(ssl)及为什么不推荐使用宝塔申请免费ssl证书
在服务器上正确配置域名https证书(ssl)及为什么不推荐使用宝塔申请免费ssl证书
16 4
|
10天前
|
安全 网络安全 Windows
【Azure App Service】遇见az命令访问HTTPS App Service 时遇见SSL证书问题,暂时跳过证书检查的办法
在访问App Service的KUDU工具或使用`az webapp deploy`时遇到SSL错误:`SSL: CERTIFICATE_VERIFY_FAILED`。解决方法是临时禁用Azure CLI的SSL验证。在PowerShell中,设置`$env:ADAL_PYTHON_SSL_NO_VERIFY`和`$env:AZURE_CLI_DISABLE_CONNECTION_VERIFICATION`为1;在Windows命令提示符中,使用`set AZURE_CLI_DISABLE_CONNECTION_VERIFICATION=1`。注意,这可能引入安全风险,应仅在必要时使用。
|
28天前
|
云安全 算法 数据建模
阿里云SSL证书免费版申请流程,收费版证书收费标准及证书类型选择参考
SSL证书是实现网站https访问必须购买的云安全类产品,现在很多用户在网站做好之后,下一步通常都是给网站域名购买SSL证书实现网站的https访问,阿里云提供申请SSL证书服务,现在每个阿里云个人或企业用户(以实名认证为准)每年可以一次性申请20张免费Digicert DV单域名试用证书(以下简称免费证书),本文为大家介绍具体的申请流程和收费证书的最新收费标准以及不同种类的证书选择参考。
阿里云SSL证书免费版申请流程,收费版证书收费标准及证书类型选择参考
|
1月前
|
安全 小程序 网络安全
阿里云腾讯云免费SSL证书托管系统的开发初衷
由于Google等公司推动,互联网安全趋势将SSL证书期限统一缩短至3个月,阿里云和腾讯云相继跟进。对于管理多个站点的小公司而言,手动维护变得繁琐。为自动化此过程,作者探索使用API解决方案。通过研究腾讯云API,成功实现证书的自动创建、审核和下载。为应对无免费到期提醒服务,作者创建计划任务,在证书到期前7天发送提醒,初期采用短信提醒,并增设公众号模板消息作为备选方案,完成到期提醒系统的构建。接下来的文章将讨论SSL证书的申请和下载流程。
59 2
|
23天前
|
网络协议 安全 应用服务中间件
阿里云申请免费ssl证书并配置nginx
阿里云申请免费ssl证书并配置nginx
109 0
|
1月前
|
存储 监控 安全
Elasticsearch 8.X 集群 SSL 证书到期了,怎么更换?
Elasticsearch 8.X 集群 SSL 证书到期了,怎么更换?
100 3