• 作者:老汪软件技巧
  • 发表时间:2024-09-05 21:01
  • 浏览量:

背景:免费的域名证书目前有效期为三个月,频繁更换太过麻烦,也很容易出现证书到期的情况,所以我们要想办法来解决这些问题

一、前言

域名证书是一个企业站点必须要有的,否则站点会被标记为危险站点。

域名证书包括收费和免费两种,收费的一般能适配更多浏览器,但需要每年都要为此付费。

所以很多企业对于不太重要的域名会退而求次选择免费证书,免费证书申请比较简单,但目前免费证书只有三个月的有效期,所以更换就会很频繁。

本文主要介绍了在实践过程中遇到的几个解决方案:

二、certbot自动更新免费证书(推荐)

安装工具:/

1、certbot安装

选择证书类型,这里选择nginx,一步步操作即可

/instruction…

根据服务器类型,安装epel-release: snapcraft.io/docs/instal…

2、证书安装

安装成功后,执行certbot即可看到命令

最后执行,即可更新证书,域名必须有对应的解析

sudo certbot --nginx

测试自动更新

sudo certbot renew --dry-run

需要自动更新时,我们增加一个cron定时任务即可

3、安装和使用问题

1、如何自动更新证书

2、网络问题、国内网络不行,安装 sudo yum install epel-release 过程中报错

https://download.docker.com/linux/centos/7/x86_64/stable/repodata/repomd.xml: [Errno 14] curl#7 - "Failed connect to download.docker.com:443; No route to host"
Trying other mirror.

3、解决办法,使用国内镜像源

sudo vi /etc/yum.repos.d/docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

三、脚本更新证书

免费证书我们可以通过工具自动更新,但是收费的证书还是需要我们手动更新,这样无疑容易出错,所以就有了下面的脚本

1、备份脚本

在执行替换前,要执行备份,方便出现问题及时回滚

#!/bin/bash
domain=test.com
backup_addr="/usr/local/openresty/nginx/ssl-backup"
base_addr="/usr/local/openresty/nginx/cert"
timestamp=$(date +"%Y%m%d%H%M%S")
# 一、检查备份目录是否存在,不存在则创建
if [ ! -d "$backup_addr/${domain}/$timestamp/" ]; then
    # 如果不存在则创建目录
    mkdir -p "$backup_addr/${domain}/$timestamp/"
    echo "Created backup directory: $backup_addr/${domain}/$timestamp/"
else
    echo "Backup directory already exists: $backup_addr/${domain}/$timestamp/"
fi
## 证书文件
CERT_FILE="${base_addr}/${domain}/private.key"
KEY_FILE="${base_addr}/${domain}/public.pem"
# 二、备份证书
cp "$CERT_FILE" "$backup_addr/${domain}/$timestamp/"
cp "$KEY_FILE" "$backup_addr/${domain}/$timestamp/"
echo "Backup completed: $backup_addr/${domain}/$timestamp/"

2、验证证书、并更新脚本

更新完成后,需要重新加载nginx配置: nginx -s reload

#!/bin/bash
domain=test.com
base_addr="/usr/local/openresty/nginx/cert"
# 新证书所在位置
cd /tmp/ssl/${domain}
# 替换前检查下证书是否和域名一致
cert_file="./private.key"
# 提取证书中的 Subject 字段
subject=$(openssl x509 -in "$cert_file" -noout -subject)
# 检查 Subject 字段是否包含 '${domain}'
if echo "$subject" | grep -q "${domain}"; then
    echo "This is a ${domain} certificate."
else
    echo "This is NOT a ${domain} certificate."
    exit 1
fi
# 将新的证书CP到Nginx配置的地址
cp ./private.key "${base_addr}/${domain}"
cp ./public.pem "${value}/${domain}"

3、回滚脚本

回滚是每次变更都要考虑的事情,线上环境怎么重视都不为过

#!/bin/bash
domain=test.com
backup_addr="/usr/local/openresty/nginx/ssl-backup"
base_addr="/usr/local/openresty/nginx/cert"
# 一、检查域名备份目录是否存在
domain_backup_dir="$backup_addr/$domain"
if [ ! -d "$domain_backup_dir" ]; then
    echo "No backup found for domain: $domain"
    exit 1
fi
# 二、获取最近的备份目录
latest_backup=$(ls -t "$domain_backup_dir" | head -n 1)
echo $latest_backup
# 三、检查是否找到备份
if [ -z "$latest_backup" ]; then
    echo "No backups available for domain: $domain"
    exit 1
fi
## 显示最新的备份路径
latest_backup_path="$domain_backup_dir/$latest_backup"
echo "Latest backup for domain $domain is: $latest_backup_path"
# 五、将新的证书替换一下
cd /tmp/ssl/${domain}/
cp ./private.key "${value}/"
cp ./public.pem "${value}/"

四、证书监控告警

我们来配置域名的有效期看板,然后通过webhook推送告警给企业微信、邮箱、短信等,这样就可以及时提醒我们更换证书,我们通过blackbox + prometheus + alertmanager + webhook来实现

1、工具介绍

erDiagram 
EXPORTER ||--o{ PROMETHEUS : exports_to PROMETHEUS ||--|{ GRAFANA : feeds_data_to PROMETHEUS ||--|{ ALERTMANAGER : triggers_alerts_to ALERTMANAGER ||--|{ WEBHOOK : sends_alerts_to BACKBOX }|..|{ PROMETHEUS : hosts

了解下几个专有名词:

通过以上关系图,我们可以看到各个工具的作用,以Prometheus为中心,我们通过各种exporter上报数据

2、prometheus

prometheus 用于收集和存储有关系统和应用程序性能的数据,并提供查询和告警功能,想要收集数据只需要将数据源通过http请求暴露出来即可,例如::9000/metrics

1)安装

sudo docker run -d --rm \
  -p 9090:9090 \
  -v /data/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
  -v /data/prometheus/rules:/data/prometheus/rules \
  prom/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \
  --web.enable-lifecycle

这里我们映射下prometheus的配置和alertmanager的配置文件

域名证书生成器__域名证书检测

/data/prometheus/prometheus.yml

2)配置文件介绍

Prometheus 配置文件通常包含以下四个主要部分:

global(全局配置) :

alerting(告警设置) :

rule_files(告警规则文件) :

scrape_configs(数据抓取配置) :

# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - {IP}:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - "/data/prometheus/rules/*.rules"
  # - "first_rules.yml"
  # - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=` to any timeseries scraped from this config.
  - job_name: "prometheus"
    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
    static_configs:
      - targets: ["localhost:9090"]

可以使用默认的配置文件,访问IP:9090即可看到prometheus的界面

3、Grafana1) 介绍

grafana 数据可视化工具,部署完成后访问IP:3000即可看到web页面

2)安装

sudo docker run -d \
  --name grafana \
  --restart unless-stopped \
  -p 3000:3000 \
  grafana/grafana-enterprise

3)配置和使用

可以添加很多数据来源,只要通过 :3000/metrics, 暴露出原数据即可

通过配置可以实现如下的各种看板

4、blackbox_exporter

想知道某个网站是否能正常访问,blackbox_exporter可以通过定期发送请求并检查响应来收集关于该网站可用性的信息

sudo docker run -d --rm \
   -p 9115:9115 \
   --name blackbox_exporter \
   -v $(pwd):/data/blackbox/config \
   quay.io/prometheus/blackbox-exporter:latest \
   --config.file=/data/blackbox/config/blackbox.yml

我们可以看到,通过blackbox_exporter采集到的源数据

注意

这里展示了blackbox_exporter,还有很多exporter可以采集例如数据库、服务器、nginx等等大量的数据。

5、alertmanager

sudo docker run -d --rm --name alertmanager -d \
  -p 9093:9093 \
  -v /data/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
  quay.io/prometheus/alertmanager \
  --config.file=/etc/alertmanager/alertmanager.yml

访问IP:9093即可访问web页面,可以看到我们配置的规则

配置的

部署成功后,将IP:9093配置在prometheus即可实现告警,具体的告警规则放在了/data/prometheus/rules下的*.rules文件中

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - {IP}:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - "/data/prometheus/rules/*.rules"
  # - "first_rules.yml"
  # - "second_rules.yml"

告警规则配置ssl.rules

groups:
- name: ssl_expiry
  rules:
  - alert: Ssl Cert Will Expire in 300 days
    expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 300
    for: 15s
    labels:
      severity: warning
    annotations:
      summary: "SSL certificate will expire soon on (instance {{ $labels.instance }})"
      description: "SSL certificate expires in 30 days\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"

告警规则

告警内容:正常时显示绿色,告警时显示红色

6、配置webhook

我们可以通过webhook可以同步告警消息,然后通过企业微信、电话、短信、邮件等进行告警

在线搜一个webhook来测试,当向URL推送信息,将会在左侧看到对应的告警

五、openssl 指令的应用1、使用openssl检查当前证书是否和域名匹配

cert_file="./private.key"
### 提取证书中的 Subject 字段
subject=$(openssl x509 -in "$cert_file" -noout -subject)
### 检查 Subject 字段是否包含 'CN=test.com'
if echo "$subject" | grep -q "CN=test.com"; then
    echo "This is a test.com certificate."
else
    echo "This is NOT a test.com certificate."
fi

2、查看域名信息

openssl x509 -in ./private.key -text -noout

六、参考