阿里云服务器使用 Let's Encrypt 配置 SSL 证书
阿里云服务器使用 Let's Encrypt 配置 SSL 证书
一、准备工作
1. 确保满足条件
- 拥有域名(如 example.com)
- 域名已解析到阿里云服务器 IP
- 服务器已安装 Nginx/Apache
- 80/443 端口已开放
2. 检查网络和防火墙
# 阿里云安全组开放端口
# 控制台 → 安全组 → 配置规则 → 添加规则
# 端口:80, 443
# 授权对象:0.0.0.0/0
# 服务器防火墙
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload
# 或
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
二、安装 Certbot
1. 方法一:通过 snap 安装(推荐)
# 安装 snap
sudo apt update
sudo apt install snapd -y
# 移除旧版本 certbot(如果有)
sudo apt remove certbot
sudo snap remove certbot
# 安装 snap core
sudo snap install core
sudo snap refresh core
# 安装 certbot
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
2. 方法二:通过包管理器安装
# Ubuntu/Debian
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
# CentOS/RHEL
sudo yum install epel-release -y
sudo yum install certbot python3-certbot-nginx -y
三、获取 SSL 证书
1. 使用 Nginx 插件自动配置(最简便)
# 自动获取并配置证书
sudo certbot --nginx -d example.com -d www.example.com
# 多个域名
sudo certbot --nginx \
-d example.com \
-d www.example.com \
-d api.example.com \
-d blog.example.com
交互过程提示:
- 输入邮箱(接收续期提醒)
- 同意服务条款
- 是否分享邮箱(可选)
- 选择为哪些虚拟主机配置 HTTPS
- 是否自动将所有 HTTP 重定向到 HTTPS(推荐选择 2)
2. 仅获取证书(手动配置)
# 仅获取证书,不修改配置
sudo certbot certonly --nginx \
-d example.com \
-d www.example.com
证书位置:
/etc/letsencrypt/live/example.com/
├── cert.pem # 证书文件
├── chain.pem # 中间证书
├── fullchain.pem # 完整证书链
└── privkey.pem # 私钥文件
四、Nginx 手动配置 SSL
如果选择手动配置,在 Nginx 配置中添加:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com www.example.com;
# SSL 证书路径
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# SSL 优化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
root /var/www/example.com/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
# HTTP 重定向到 HTTPS
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
五、自动续期配置
1. 测试续期
# 测试续期(不实际执行)
sudo certbot renew --dry-run
2. 自动续期配置
Let's Encrypt 证书有效期为 90 天,需要定期续期。
# 查看定时任务
sudo systemctl list-timers
# 手动测试续期
sudo certbot renew
3. 添加自动续期脚本
# 创建续期脚本
sudo nano /etc/cron.daily/certbot-renew
脚本内容:
#!/bin/bash
certbot renew --quiet --post-hook "systemctl reload nginx"
设置权限:
sudo chmod +x /etc/cron.daily/certbot-renew
4. 使用 systemd 定时任务
# 查看现有定时任务
sudo systemctl list-timers | grep certbot
# 手动运行续期
sudo certbot renew
六、证书管理命令
1. 常用命令
# 查看证书信息
sudo certbot certificates
# 删除证书
sudo certbot delete --cert-name example.com
# 修改证书(添加/删除域名)
sudo certbot --nginx -d example.com -d www.example.com -d newsub.example.com
# 强制更新证书
sudo certbot renew --force-renewal
2. 证书文件位置
# 证书文件路径
/etc/letsencrypt/live/example.com/
# 所有存档
/etc/letsencrypt/archive/example.com/
# 配置
/etc/letsencrypt/renewal/example.com.conf
七、高级配置
1. 通配符证书(需要 DNS 验证)
# 安装 DNS 插件
sudo snap set certbot trust-plugin-with-root=ok
sudo snap install certbot-dns-aliyun
# 获取阿里云 DNS API 密钥
# 阿里云控制台 → RAM 访问控制 → 创建用户(授权 AliyunDNSFullAccess)
# 获取 AccessKey ID 和 Secret
# 创建配置文件
sudo mkdir -p /etc/letsencrypt
sudo nano /etc/letsencrypt/aliyun.ini
aliyun.ini内容:
dns_aliyun_access_key = YOUR_ACCESS_KEY_ID
dns_aliyun_access_key_secret = YOUR_ACCESS_KEY_SECRET
获取通配符证书:
sudo certbot certonly \
--authenticator dns-aliyun \
--dns-aliyun-credentials /etc/letsencrypt/aliyun.ini \
-d "*.example.com" \
-d example.com
2. 使用 Docker 获取证书
# 拉取 certbot 镜像
docker pull certbot/certbot
# 运行 certbot
docker run -it --rm \
-v /etc/letsencrypt:/etc/letsencrypt \
-v /var/lib/letsencrypt:/var/lib/letsencrypt \
-p 80:80 \
certbot/certbot certonly --standalone -d example.com
八、Nginx SSL 优化配置
server {
listen 443 ssl http2;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# 优化配置
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
# 现代配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS (可选,谨慎开启)
add_header Strict-Transport-Security "max-age=63072000" always;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
}
九、常见问题解决
1. 端口 80 被占用
# 检查占用
sudo lsof -i :80
sudo netstat -tulnp | grep :80
# 停止占用程序或修改 Nginx 配置
2. 证书续期失败
# 检查错误日志
sudo tail -f /var/log/letsencrypt/letsencrypt.log
# 手动调试
sudo certbot renew --debug
3. 阿里云安全组配置
确保安全组规则包含:
- 入方向:80/tcp, 443/tcp
- 出方向:无限制
4. 验证证书
# 在线验证
curl -I https://example.com
# 查看证书信息
openssl s_client -connect example.com:443 -servername example.com
十、备份和恢复
# 备份证书
sudo tar -czf letsencrypt-backup-$(date +%Y%m%d).tar.gz /etc/letsencrypt/
# 恢复证书
sudo tar -xzf letsencrypt-backup.tar.gz -C /
sudo systemctl reload nginx
完成以上步骤后,您的网站应该可以通过 HTTPS 访问,并显示安全锁标志。