[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证书了