Files
acme_renew/README.md
jeremygan2021 5d12be811e first commit
2026-03-03 15:01:07 +08:00

305 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ACME SSL 证书自动管理工具集
一个功能强大的 ACME SSL 证书自动管理工具集合,专为 Nginx 服务器环境设计,提供证书更新、环境诊断和自动化管理功能。
## 🎯 项目概述
本项目包含三个核心脚本,用于解决 SSL 证书管理的常见痛点:
- **自动证书更新**:智能检测证书有效期并自动更新
- **环境诊断**:全面检测 ACME 挑战环境配置
- **一键管理**:简化复杂的证书管理流程
## 📋 功能特性
### 🔄 自动证书更新 (`update_acme_cert.sh`)
- **智能过期检测**自动检查证书剩余有效期默认30天预警
- **多种更新模式**:支持自动更新、强制更新、仅安装模式
- **Nginx 集成**:自动解析 Nginx 配置文件,提取证书路径
- **权限管理**:自动设置正确的文件权限和所有者
- **安全验证**:证书内容验证和指纹检查
- **彩色日志**:中文彩色输出,便于阅读和调试
- **完整日志**:详细的操作日志记录到 `/var/log/acme_update.log`
### 🔍 环境诊断 (`acme_test.sh`)
- **DNS 解析检查**:验证域名解析是否正确指向服务器
- **Webroot 权限测试**:检测挑战文件写入权限
- **Nginx 配置检查**:验证 ACME 挑战 location 规则
- **HTTP 访问测试**:模拟 Let's Encrypt 验证过程
- **网络连通性**:检测端口监听和外部访问
- **智能清理**:自动清理测试文件
### 🛠️ 核心优势
- **零配置依赖**:自动检测和适配现有环境
- **错误恢复**:详细的错误提示和解决方案建议
- **安全加固**:遵循最佳安全实践
- **中文友好**:完整的中文界面和日志输出
- **生产就绪**:经过充分测试,适用于生产环境
## 🚀 快速开始
### 环境要求
- **操作系统**Linux (Ubuntu/CentOS/Debian 等)
- **权限要求**root 权限或 sudo 访问
- **依赖软件**
- Nginx Web 服务器
- acme.sh 证书工具
- curl、openssl、grep 等基础工具
### 安装步骤
1. **克隆项目**
```bash
git clone <项目地址>
cd acme-ssl-manager
```
2. **设置执行权限**
```bash
chmod +x *.sh
```
3. **安装 acme.sh**(如果尚未安装)
```bash
curl https://get.acme.sh | sh
```
4. **配置 Nginx**
确保您的 Nginx 配置包含 ACME 挑战 location 规则:
```nginx
location ^~ /.well-known/acme-challenge/ {
allow all;
root /var/www/letsencrypt;
}
```
## 📖 使用指南
### 1. 环境诊断(推荐先运行)
在使用证书更新功能前,建议先运行环境诊断脚本:
```bash
# 交互式模式
sudo ./acme_test.sh
# 直接指定域名
sudo ./acme_test.sh example.com
# 指定域名和Webroot
sudo ./acme_test.sh example.com /var/www/letsencrypt
```
诊断脚本将检查:
- ✅ DNS 解析是否正确
- ✅ Webroot 目录权限
- ✅ Nginx 配置完整性
- ✅ HTTP 访问可用性
- ✅ 端口监听状态
### 2. 证书更新
#### 基本用法
```bash
# 交互式更新
sudo ./update_acme_cert.sh
# 直接更新指定域名(需要修改脚本)
# 编辑脚本设置 DOMAIN 变量
```
#### 操作模式
脚本运行时会根据证书状态提供不同选项:
1. **证书即将过期**<30天自动执行更新
2. **证书仍有效**:提供三个选项
- **强制更新**:重新颁发证书
- **仅安装**:跳过更新,仅安装现有证书
- **退出**:不做任何操作
#### 更新流程
1. **权限检查**:验证 root 权限
2. **域名输入**:交互式输入目标域名
3. **配置解析**:自动查找 Nginx 配置文件
4. **证书检测**:检查当前证书有效期
5. **证书更新**:使用 acme.sh 颁发新证书
6. **证书安装**:安装到指定位置
7. **权限设置**:设置正确的文件权限
8. **Nginx 重载**:使新证书生效
9. **最终验证**:确认证书安装成功
### 3. 配置文件
#### 主要配置项
编辑脚本文件修改以下配置:
```bash
# acme.sh 路径
ACME_SH="/root/.acme.sh/acme.sh"
# Nginx 配置目录
NGINX_CONF_DIR="/etc/nginx/conf.d"
# Webroot 路径
WEBROOT="/var/www/letsencrypt"
# 证书存储目录
TLS_BASE_DIR="/etc/nginx/tls"
# 日志文件
LOG_FILE="/var/log/acme_update.log"
```
#### 高级配置
- **强制更新**:设置 `FORCE_RENEW="true"`
- **自定义 CA**:修改 `--server` 参数
- **通知设置**:可集成邮件/Webhook 通知
## 🔧 高级功能
### 证书指纹验证
支持自定义证书指纹验证:
```bash
# 在 verify_cert_success 函数中启用指纹检查
if grep -q "YOUR_FINGERPRINT" "$cert_file"; then
log_info "✅ 证书指纹验证通过"
return 0
fi
```
### 多域名支持
支持通配符域名和多域名证书:
```bash
# 修改 renew_certificate 函数
local cmd="$ACME_SH --issue -d $DOMAIN -d *.${DOMAIN} --webroot $WEBROOT"
```
### 自动续期
设置定时任务实现自动续期:
```bash
# 编辑 crontab
crontab -e
# 添加以下内容(每天凌晨检查)
0 2 * * * /path/to/update_acme_cert.sh >> /var/log/acme_cron.log 2>&1
```
## 📊 日志和监控
### 日志文件
- **更新日志**`/var/log/acme_update.log`
- **定时任务日志**`/var/log/acme_cron.log`
### 日志格式
```
[INFO] 2026-03-03 10:30:45 - 目标域名: example.com
[步骤] 2026-03-03 10:30:45 - 解析配置文件,提取证书路径...
[警告] 2026-03-03 10:30:45 - 证书即将过期(<30天需要更新
```
### 监控建议
- **日志轮转**:配置 logrotate 管理日志文件
- **监控告警**:监控日志中的错误关键词
- **证书监控**:设置证书有效期监控告警
## 🐛 故障排除
### 常见问题
#### 1. DNS 解析失败
```bash
# 检查域名解析
dig +short your-domain.com
# 或
nslookup your-domain.com
```
#### 2. Webroot 权限问题
```bash
# 修正权限
sudo chown -R www-data:www-data /var/www/letsencrypt
sudo chmod -R 755 /var/www/letsencrypt
```
#### 3. Nginx 配置错误
```bash
# 检查 Nginx 配置
sudo nginx -t
# 重载配置
sudo service nginx force-reload
```
#### 4. 端口未监听
```bash
# 检查端口监听
sudo ss -tlnp | grep ':80'
# 检查防火墙
sudo ufw status
sudo iptables -L
```
#### 5. acme.sh 未安装
```bash
# 安装 acme.sh
curl https://get.acme.sh | sh
# 重新加载环境
source ~/.bashrc
```
### 错误代码说明
| 错误类型 | 说明 | 解决方案 |
|---------|------|----------|
| DNS 解析不一致 | 域名解析 IP 与服务器 IP 不匹配 | 检查 DNS 设置,确认域名指向正确 |
| Webroot 写入失败 | 无法写入挑战文件 | 检查目录权限和磁盘空间 |
| HTTP 访问失败 | 无法通过 HTTP 访问挑战文件 | 检查 Nginx 配置和端口监听 |
| 证书颁发失败 | acme.sh 无法颁发证书 | 检查域名解析、Webroot 配置 |
## 🔒 安全考虑
### 文件权限
- **证书文件**:设置为 600仅所有者可读写
- **所有者**:设置为 www-dataNginx 运行用户)
- **目录权限**Webroot 目录设置为 755
### 最佳实践
1. **定期更新**:及时更新证书避免过期
2. **监控告警**:设置证书有效期监控
3. **备份配置**:定期备份 Nginx 配置和证书
4. **访问控制**:限制对证书目录的访问
5. **日志审计**:定期检查操作日志
## 🤝 贡献指南
欢迎提交 Issue 和 Pull Request
### 开发规范
- 遵循 Bash 最佳实践
- 添加适当的错误处理
- 保持中文界面友好
- 更新相关文档
### 测试要求
- 在多种 Linux 发行版上测试
- 验证不同 Nginx 配置场景
- 测试错误处理和恢复机制
## 📄 许可证
本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件
## 🙏 致谢
- [acme.sh](https://github.com/acmesh-official/acme.sh) - 优秀的 ACME 客户端
- [Let's Encrypt](https://letsencrypt.org/) - 提供免费 SSL 证书
- [Nginx](https://nginx.org/) - 高性能 Web 服务器
## 📞 支持
如有问题或建议,请通过以下方式联系:
- 提交 Issue
- 发送邮件至:[your-email@example.com]
- 访问项目主页:[项目地址]
---
**⭐ 如果这个项目对您有帮助,请给我们一个 Star**