哈喽大家好,我是咸鱼。

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

通过 saltstack 批量更新 SSL 证书的更多相关文章

  1. 在Docker上部署自动更新ssl证书的nginx + .NET CORE

    突发奇想要搞一个ssl的服务器,然后我就打起了docker的主意,想着能不能搞一个基于Docker的服务器,这样维护起来也方便一点. 设想 想法是满足这么几点: .NET CORE on Docker ...

  2. Let's Encrypt申请免费SSL证书

    1.https的作用 安全,防止网站被劫持,数据被修改 2.Let's Encrypt是什么 Let's Encrypt是一个证书授权机构(CA),可以从Let's Encrypt获得网站域名的免费证 ...

  3. SSL证书更换(具体路径可参考iRedMail.tips文件)及邮件服务器架构

    由于Google的chrome不认可赛门铁克的证书,因此要更换新证书 0.8.6版本                                         0.9.4版本 - /etc/pk ...

  4. 如何在 CentOS 7 上生成 SSL 证书为 Nginx 加密

    本文首发:开发指南:如何在 CentOS 7 上安装 Nginx Let’s Encrypt 是由 Internet Security Research Group (ISRG) 开发的一个自由.自动 ...

  5. 阿里云负载均衡SSL证书配置(更新)

    阿里云负载均衡及应用防火墙SSL证书配置 转载请注明地址:http://www.cnblogs.com/funnyzpc/p/8908461.html 好久了呢,距上篇博客的这段时间中:考试.搬家.工 ...

  6. letsencrypt 免费SSL证书申请, 自动更新

    Let's Encrypt 泛域名 证书申请 及自动更新 关键字:SSL证书.HTTPS 初次申请 1. 下载certbot wget https://dl.eff.org/certbot-auto ...

  7. StartCom 申请 SSL 证书及 Nginx HTTPS 支持配置全攻略

    来源:https://www.williamyao.com/index.php/archives/1397/ 前言 最近收到 StartCom 的邮件,数字证书即将过期,想到去年在 StartSSL ...

  8. 新版startssl 免费SSL证书申请 (实测 笔记 https http2 必要条件)

    简单说明: 目前多个大型网站都实现全站HTTPS,而SSL证书是实现HTTPS的必要条件之一. StartSSL是StartCom公司旗下的.提供免费SSL证书服务并且被主流浏览器支持的免费SSL.包 ...

  9. Nginx 下配置SSL证书的方法

    1.Nginx 配置 ssl 模块 默认 Nginx 是没有 ssl 模块的,而我的 VPS 默认装的是 Nginx 0.7.63 ,顺带把 Nginx 升级到 0.7.64 并且 配置 ssl 模块 ...

  10. openSSL命令、PKI、CA、SSL证书原理

    相关学习资料 http://baike.baidu.com/view/7615.htm?fr=aladdin http://www.ibm.com/developerworks/cn/security ...

随机推荐

  1. [转帖]Jmeter之JDBC Request使用方法(oracle)

    https://zhuanlan.zhihu.com/p/121747788 JDBC Request: 这个sampler可以向数据库发送一个jdbc请求(sql语句),它经常需要和JDBC Con ...

  2. [转帖]PostgreSQL(三) 内存参数优化和原理(work_mem)内存表 pgfincore插件使用方法

    1.常用内存参数 1.1 shared_buffers shared_buffers是PostgreSQL用于共享缓冲区的内存,是由8kb大小的块所形成的数组.PostgreSQL在进行更新.查询等操 ...

  3. [转帖]Java和Scala的前世今生

    第一部分:Java 计算机语言介绍 第一代语言:机器语言.指令以二进制代码形式存在 第二代语言:汇编语言.使用助记符表示一条机器指令 第三代语言:高级语言 C.Pascal.Fortran面向过程的语 ...

  4. 【转帖】调教LLaMA类模型没那么难,LoRA将模型微调缩减到几小时

    https://www.thepaper.cn/newsDetail_forward_23250236 LoRA 微调方法,随着大模型的出现而走红. 最近几个月,ChatGPT 等一系列大语言模型(L ...

  5. [转帖]iptables的四表五链与NAT工作原理

    本文主要介绍了iptables的基本工作原理和四表五链等基本概念以及NAT的工作原理. 1.iptables简介 我们先来看一下netfilter官网对iptables的描述: iptables is ...

  6. SPECJVM2008 再学习

    SPECJVM2008 再学习 摘要 昨天的太水了 感觉今天有必要再水一点.. 存在的问题 默认进行启动 sunflow 必定过不去. 一般的解决办法要求进行重新编译 但是我不知道怎么下载源码... ...

  7. 【JS 逆向百例】转变思路,少走弯路,X米加密分析

    声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 逆向目标 目标:X米账号登 ...

  8. 如何通过gRPC传输文件

    在gRPC中,可以通过将文件分割成多个小块,然后使用流式RPC将这些小块发送到服务器来传输文件.以下是一个简单的示例,展示了如何在gRPC中实现文件传输. 首先,我们需要定义一个服务来处理文件传输.在 ...

  9. MySQL 字符串与时间操作函数

    MariaDB [lyshark]> select Name,char_length(Name) from lyshark; -- 求字符串长度 +------------+---------- ...

  10. 苹果iOS的应用移除主屏幕及恢复找回

    昨天刷到一个苹果iOS系统更换微信图标的,然后就添加了一个,发现那个记录通知数字问题,想恢复回来,所以就有了此文. https://www.cnblogs.com/lzhdim/p/17909867. ...