首页 > 其他分享 >通过 saltstack 批量更新 SSL 证书

通过 saltstack 批量更新 SSL 证书

时间:2024-02-26 19:22:08浏览次数:21  
标签:批量 ssl 证书 SSL nginx year saltstack dir

哈喽大家好,我是咸鱼。

之前写过两篇关于 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 服务进行配置检查并重启一下,上面内容有,这里就不再介绍了。

标签:批量,ssl,证书,SSL,nginx,year,saltstack,dir
From: https://www.cnblogs.com/edisonfish/p/18035005

相关文章

  • mysql-批量修改表的主键id,修改成联合主键
    1.sql脚本一.通过sql脚本,查出所有表的功能,并编写插入修改的联合主键,sqlselect concat('ALTERtable',TABLE_NAME,'DROPPRIMARYKEY',',','ADDPRIMARYKEY(`id`,`org_id`)'';')from information_schema.TABLESwhereTABLE_SC......
  • vite+vue3 import批量导入图片
    vite+vue3import批量导入图片主要使用“import.meta.glob”方法。具体使用如下:1.constlist=import.meta.glob("../../static/images/left-image/*.*",{eager:true})2.imageList=Object.values(list).map((v:any)=>v.default);3.页面使用   ......
  • 详解SSL证书系列(1)什么是SSL证书?
    你一定遇到过这种情况,打开一个网站,浏览器弹出警告”您与此网站之间建立的连接不安全。由于此连接不安全,因此信息(如密码或信用卡)不会安全地发送到此网站,并且可能被其他人截获或看到”。细心的你也一定关注到,有的网址是https开头的,有的是http。https开头的网站前面,会有一把小锁。......
  • 利用GmSSL制作SM2国密证书
    Part0前言     GmSSL是一个开源的密码工具箱,支持SM2/SM3/SM4/SM9/ZUC等国密(国家商用密码)算法、SM2国密数字证书及基于SM2证书的SSL/TLS安全通信协议,支持国密硬件密码设备,提供符合国密规范的编程接口与命令行工具,可以用于构建PKI/CA、安全通信、数据加密等符合国密标准......
  • 【办公自动化】批量将Markdown文件转换为纯文本文件
    本文介绍如何将Markdown文件转换为纯文本文件。Markdown是一种轻量级的标记语言,用于编写格式简单的文档。但是,有时候我们需要将Markdown文件转换为纯文本文件,以便进行其他处理或直接在浏览器中查看。下面介绍一种简单的方法来实现这个功能。转成html要将Markdown文件转换为......
  • 全志T527国产核心板及米尔配套开发板批量上市!
    2023年12月,米尔电子联合战略合作伙伴全志科技,率先业内发布了国产第一款T527核心板及开发板。这款高性能、高性价比、八核A55的国产核心板吸引了广大客户关注,为积极响应客户需求,米尔基于全志T527核心板现已批量上市,欢迎垂询! 图:米尔国产核心板-第一款全志T527核心板 全志T52......
  • 如何申请免费的SSL证书和通配符证书
    一,目前免费证书普遍存在的痛点证书有效期普遍只有3个月2023年12月22日阿里云官方发布公告,后续免费证书的有效期统一调整为3个月,我相信其它厂商很快也会做出调整。调整为3个月有效期后,意味着您需要频繁地重新申请和安装证书,非常的麻烦。  不支持自动更新和自动部署目......
  • openssl 生成证书 server.key server.crt
    为了https,做一个免费的证书。x509证书一般会用到三类文,key,csr,crt。Key是私用密钥,通常是rsa算法。Csr是证书请求文件,用于申请证书。在制作csr文件的时,必须使用自己的私钥来签署申,还可以设定一个密钥。crt是CA认证后的证书文,(windows下面的,其实是crt),签署人用自己的key给你签署......
  • System.net.Mail only supports explicit SSL
    System.net.Mailsometimesfailstobesentunderthesslsmtpserver.Afterawhile,itseemslikethisistheproblem.Sendingmailusingsystem.net.MailwithSSLwillfail:System.net.NetworkcredentialAcred=NewSystem.net.Networkcredential("M......
  • QT使用OpenSSL的接口实现RSA2的签名和验签
    QT使用OpenSSL的接口实现RSA2的签名和验签加密和签名在RSA加密算法中是两个不同的概念,虽然它们都涉及RSA密钥对的使用,但目的和应用场景有所不同。加密(encrypt/decrypt):加密:使用接收方的公钥对数据进行加密,只有拥有相应私钥的接收方才能解密数据。解密:使用接收方的私钥对......