📜  letencrypt 自动更新 nginx - Shell-Bash (1)

📅  最后修改于: 2023-12-03 15:02:40.605000             🧑  作者: Mango

Let's Encrypt 自动更新 Nginx - Shell-Bash

让我们来了解一种通过 Let's Encrypt 自动更新 Nginx_SSL 证书的 Shell-Bash 脚本。这个脚本可以自动帮助你在Nginx服务器上更新和安装证书,在证书快过期时自动发出通知并重新生成证书。让我们来看看如何使用这个脚本来保持你的证书始终有效。

安装 Certbot 工具

首先,您需要安装 certbot 工具,它是 Let’s Encrypt 官方的证书申请工具。在 Ubuntu 上,可以使用以下命令来安装 certbot:

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot

其他操作系统环境下的 certbot 安装教程可以查看 Let's Encrypt 官方文档。

创建 Let’s Encrypt SSL 证书配置文件

接下来,需要在 Nginx 的 SSL 配置文件中添加证书配置信息。

1. 创建一个空的 SSL 配置文件

在服务器的 nginx 配置目录中创建一个新的证书配置文件,例如 /etc/nginx/sites-available/example.com.ssl.conf.

sudo touch /etc/nginx/sites-available/example.com.ssl.conf
2. 编辑 SSL 配置文件

使用文本编辑器打开新创建的 ssl 配置文件,并添加以下内容。

server {
    listen 80;
    server_name example.com www.example.com;
    location / {
        return 301 https://$server_name$request_uri;
    }
}

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;
    ssl_certificate /etc/nginx/ssl/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/nginx/ssl/live/example.com/chain.pem;
    include /etc/nginx/snippets/ssl-params.conf;
    # Your Nginx server block
}

其中 server_name 需要替换为您的域名,ssl_certificatessl_certificate_keyssl_trusted_certificate 分别对应 Let's Encrypt 生成的公钥证书、私钥证书和中间证书。 ssl-params.conf 应该包含您为 SSL 配置定义的一些常用设置。

请注意替换掉路径和域名。

3. 激活 SSL 配置文件

创建完 SSL 配置文件后,需要将其激活。使用以下命令创建一个符号链接,将其链接到 sites-enabled 目录中激活,以启用该站点。

sudo ln -s /etc/nginx/sites-available/example.com.ssl.conf /etc/nginx/sites-enabled/
sudo systemctl reload nginx
设置自动更新以及通知

为了让 Let's Encrypt 证书自动更新并发出通知,我们需要编写一个 Bash 脚本,当证书快要过期时,该脚本将自动重新生成证书。此脚本应该放置在 /etc/letsencrypt/renewal-hooks/post 目录中。

以下是一个例子.

#!/bin/bash
#
# -- Description: A script to automatically update the SSL certificate used
#                 by Nginx using Certbot.
# -- Author:      Your Name <you@example.com>
#

# Specifying the root domain name
DOMAIN="example.com"

# Specifying the certificate log file
LOGFILE=/var/log/certbot/certbot-auto.log

# Specifying the email address to use for renewal notifications
EMAIL="you@example.com"

# Specifying the number of days before renewing the certificate
DAYS=30

# Specifying the Nginx config file to use for the SSL configuration
SSL_FILE="/etc/nginx/sites-available/$DOMAIN.ssl.conf"

# Check if certbot is installed
if [ ! -x /usr/local/bin/certbot-auto ]; then
        echo "Certbot is not installed. Please install it."
        exit 1
fi

# Check if the SSL file exists
if [ ! -f "$SSL_FILE" ]; then
        echo "SSL file ($SSL_FILE) does not exist. Exiting."
        exit 1
fi

# Run certbot to renew the certificate
sudo /usr/local/bin/certbot-auto certonly --non-interactive --agree-tos --email $EMAIL --webroot --webroot-path /var/www/html -d $DOMAIN --cert-name $DOMAIN --log $LOGFILE

# Check if the certificate was renewed successfully
if [ "$?" -ne "0" ]; then
        echo "Certificate Renewal Failed. Exiting."
        exit 1
fi

# Reload the Nginx configuration to apply the new certificate
sudo systemctl reload nginx

# Send an email notification
SUBJECT="[Renewal] $DOMAIN SSL Certificate"
BODY="Your SSL certificate for $DOMAIN has been renewed."
if [ $(echo "$DAYS > 0" | bc) -eq 1 ]; then
        BODY="$BODY Your certificate will expire in $DAYS days."
fi
echo "$BODY" | mail -s "$SUBJECT" "$EMAIL"

请注意替换以下变量:

  • DOMAIN: 域名的根域名
  • LOGFILE: 记录 certbot 日志的文件路径
  • EMAIL: 用于更新通知的电子邮件地址
  • DAYS: 在多少天内更新证书
  • SSL_FILE: 您的 SSL 配置文件的路径

将脚本复制到 /etc/letsencrypt/renewal-hooks/post 目录中并添加执行权限。在 DAYS 变量之前,您需要在 /var/spool/cron/crontabs/root 中设置 cron 作业。

0 0 */$DAYS * * /bin/bash /etc/letsencrypt/renewal-hooks/post/update-ssl.sh

这将在每个等于 $DAYS 变量的天数的午夜零点执行脚本。注意在 $DAYS 变量之前的空格不能省略。 如果 DAYS 变量设置为 30,则脚本每 30 天运行一次并自动更新您的 SSL 证书,如果发现证书即将过期,则会发送电子邮件通知您证书已更新。

结论

这个 Shell-Bash 脚本可以大大简化 Let's Encrypt SSL 证书的自动更新流程,也可以使您始终保持安全和更新的 SSL 证书。当您的 SSL 证书即将过期时,该脚本将自动更新它,并向您发送通知,以确保您的站点在 SSL 证书方面始终保持卓越和安全。


代码片段:

# Specifying the root domain name
DOMAIN="example.com"

# Specifying the certificate log file
LOGFILE=/var/log/certbot/certbot-auto.log

# Specifying the email address to use for renewal notifications
EMAIL="you@example.com"

# Specifying the number of days before renewing the certificate
DAYS=30

# Specifying the Nginx config file to use for the SSL configuration
SSL_FILE="/etc/nginx/sites-available/$DOMAIN.ssl.conf"

# Run certbot to renew the certificate
sudo /usr/local/bin/certbot-auto certonly --non-interactive --agree-tos --email $EMAIL --webroot --webroot-path /var/www/html -d $DOMAIN --cert-name $DOMAIN --log $LOGFILE

# Reload the Nginx configuration to apply the new certificate
sudo systemctl reload nginx

Cron 作业:

0 0 */$DAYS * * /bin/bash /etc/letsencrypt/renewal-hooks/post/update-ssl.sh