📅  最后修改于: 2023-12-03 15:02:40.605000             🧑  作者: Mango
让我们来了解一种通过 Let's Encrypt 自动更新 Nginx_SSL 证书的 Shell-Bash 脚本。这个脚本可以自动帮助你在Nginx服务器上更新和安装证书,在证书快过期时自动发出通知并重新生成证书。让我们来看看如何使用这个脚本来保持你的证书始终有效。
首先,您需要安装 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 官方文档。
接下来,需要在 Nginx 的 SSL 配置文件中添加证书配置信息。
在服务器的 nginx 配置目录中创建一个新的证书配置文件,例如 /etc/nginx/sites-available/example.com.ssl.conf
.
sudo touch /etc/nginx/sites-available/example.com.ssl.conf
使用文本编辑器打开新创建的 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_certificate
,ssl_certificate_key
和 ssl_trusted_certificate
分别对应 Let's Encrypt 生成的公钥证书、私钥证书和中间证书。 ssl-params.conf
应该包含您为 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