[Linux基础]-19-全自动为Nginx申请证书
引言
这篇文章用一个脚本全自动为 Nginx 申请 Let's Encrypt 证书并配置自动续期
文章目录
0×1.使用setup_ssl.sh全自动申请证书
前提,系统已经安装了Nginx,并且已经配置了网站/域名
#!/bin/bash
# =====================
# 脚本名称:setup_ssl.sh
# 功能:全自动为 Nginx 申请 Let's Encrypt 证书并配置自动续期
# 系统:Ubuntu/Debian
# =====================
set -euo pipefail
# --------------------------
# 颜色定义 (为了好看)
# --------------------------
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# --------------------------
# 1. 权限与环境检查
# --------------------------
echo -e "${YELLOW}[1/6] 正在检查环境...${NC}"
# 检查是否为 root
if [ "$EUID" -ne 0 ]; then
echo -e "${RED}请使用 sudo 运行此脚本: sudo bash $0${NC}"
exit 1
fi
# 检查 Nginx 是否已安装
if ! command -v nginx &> /dev/null; then
echo -e "${RED}错误:未检测到 Nginx,请先安装 Nginx。${NC}"
exit 1
fi
echo -e "${GREEN}环境检查通过。${NC}"
# --------------------------
# 2. 获取用户输入
# --------------------------
echo ""
echo -e "${YELLOW}[2/6] 请输入配置信息:${NC}"
read -p "请输入你的域名 (例如 example.com): " DOMAIN
read -p "请输入你的邮箱 (用于证书过期提醒): " EMAIL
# 简单的非空校验
if [ -z "$DOMAIN" ] || [ -z "$EMAIL" ]; then
echo -e "${RED}域名和邮箱不能为空!${NC}"
exit 1
fi
# 询问是否包含 www 前缀
read -p "是否同时为 www.$DOMAIN 也申请证书? (y/n): " INCLUDE_WWW
DOMAIN_ARGS="-d $DOMAIN"
if [[ $INCLUDE_WWW =~ ^[Yy]$ ]]; then
DOMAIN_ARGS="-d $DOMAIN -d www.$DOMAIN"
fi
# --------------------------
# 3. 安装 Certbot
# --------------------------
echo ""
echo -e "${YELLOW}[3/6] 正在更新软件源并安装 Certbot...${NC}"
apt update -y
apt install -y certbot python3-certbot-nginx
echo -e "${GREEN}Certbot 安装完成。${NC}"
# --------------------------
# 4. 生成强 DH 参数 (可选但推荐,提升安全性)
# --------------------------
echo ""
echo -e "${YELLOW}[4/6] 正在生成强加密参数 (这一步可能需要几分钟,请耐心等待)...${NC}"
if [ ! -f /etc/ssl/certs/dhparam.pem ]; then
openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
echo -e "${GREEN}DH 参数生成完成。${NC}"
else
echo -e "${GREEN}DH 参数已存在,跳过生成。${NC}"
fi
# --------------------------
# 5. 申请证书
# --------------------------
echo ""
echo -e "${YELLOW}[5/6] 正在向 Let's Encrypt 申请证书...${NC}"
echo -e "域名: $DOMAIN_ARGS"
echo -e "邮箱: $EMAIL"
# 核心命令:--nginx 表示自动配置 Nginx
certbot run --nginx \
--non-interactive \
--agree-tos \
--no-eff-email \
--email "$EMAIL" \
$DOMAIN_ARGS
if [ $? -eq 0 ]; then
echo -e "${GREEN}证书申请成功!${NC}"
else
echo -e "${RED}证书申请失败,请检查域名 DNS 是否解析正确。${NC}"
exit 1
fi
# --------------------------
# 6. 配置自动续期
# --------------------------
echo ""
echo -e "${YELLOW}[6/6] 正在配置自动续期任务...${NC}"
# Certbot 通常会自动安装 systemd timer,但我们确保它是激活的
systemctl enable --now certbot.timer
# 测试续期是否正常 (模拟运行)
echo -e "${YELLOW}正在测试续期流程 (dry run)...${NC}"
certbot renew --dry-run
echo ""
echo "==============================="
echo -e "${GREEN} ✅ 全部配置完成!${NC}"
echo ""
echo " 你的网站已启用 HTTPS。"
echo " 证书路径: /etc/letsencrypt/live/$DOMAIN/"
echo " 自动续期已通过 systemd timer 配置,无需手动操作。"
echo ""
echo " 建议运行: sudo nginx -t 检查配置,然后 sudo systemctl restart nginx"
echo "==============================="
运行脚本,然后按照提示输入自己的域名和邮箱就能得到ssl证书了