1. 为什么Windows Server需要Let's Encrypt证书
在Windows Server上部署HTTPS证书一直是个令人头疼的问题。传统商业证书价格昂贵,每年续费流程繁琐,而自签名证书又会被浏览器标记为不安全。Let's Encrypt的出现彻底改变了这个局面——它提供完全免费的DV证书,且支持自动化续期。
但Windows Server官方工具对Let's Encrypt的支持并不友好。我测试过至少三种方案后,最终确定Win-ACME+Nginx的组合最稳定可靠。这个方案的优势在于:
- 完全兼容IIS和Nginx
- 支持通配符证书
- 自动续期成功率高达99%
- 配置过程仅需5分钟
重要提示:虽然Let's Encrypt证书免费,但建议仅用于非商业场景。商业网站仍需考虑EV证书以获得更高信任级别。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与工具安装
2.1 系统要求检查
首先确认你的Windows Server版本:
- Windows Server 2012 R2及以上
- .NET Framework 4.6+运行环境
- 管理员权限的PowerShell
通过以下命令检查.NET版本:
powershell复制Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name Version -EA 0 | Where { $_.PSChildName -Match '^(?!S)\p{L}'} | Select PSChildName, Version
2.2 Win-ACME安装
推荐使用官方推荐的web脚本安装方式:
powershell复制Invoke-WebRequest -Uri "https://www.win-acme.com/download" -OutFile "wacs.zip"
Expand-Archive -Path "wacs.zip" -DestinationPath "C:\wacs"
cd C:\wacs
.\wacs.exe
首次运行时会自动完成初始化配置。我建议选择"高级模式(M)"以获得更多控制权。
3. Nginx配置与证书申请
3.1 Nginx基础配置
假设你的网站配置文件位于:
code复制C:\nginx\conf\conf.d\mysite.conf
典型配置示例:
nginx复制server {
listen 80;
server_name example.com www.example.com;
location /.well-known/acme-challenge/ {
root C:\nginx\html;
}
location / {
return 301 https://$host$request_uri;
}
}
3.2 证书申请流程
在Win-ACME交互界面中:
- 选择"创建新证书"
- 选择验证方式为"HTTP-01"
- 输入域名(支持通配符如*.example.com)
- 选择存储方式为"PEM encoded files"
- 设置Nginx证书路径:
- 私钥文件:C:\nginx\conf\ssl\private.key
- 证书文件:C:\nginx\conf\ssl\fullchain.pem
实测发现:如果Nginx正在运行,Win-ACME会自动检测并重新加载配置。如果遇到权限问题,建议临时关闭Nginx服务。
4. HTTPS配置与优化
4.1 Nginx SSL配置
更新Nginx配置启用HTTPS:
nginx复制server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate C:\nginx\conf\ssl\fullchain.pem;
ssl_certificate_key C:\nginx\conf\ssl\private.key;
# 安全优化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 其他业务配置...
}
4.2 自动续期验证
Win-ACME默认会创建计划任务自动续期。验证任务是否创建成功:
powershell复制Get-ScheduledTask -TaskName "Win-ACME Renewal"
建议手动触发一次续期测试:
powershell复制Start-Process "C:\wacs\wacs.exe" -ArgumentList "--renew --baseuri https://acme-v02.api.letsencrypt.org/"
5. 常见问题排查
5.1 验证失败处理
如果遇到验证失败,检查:
- 防火墙是否开放80端口
- Nginx是否正确处理了/.well-known/acme-challenge/请求
- 域名解析是否正确
可以使用在线验证工具检查:
powershell复制Invoke-WebRequest -Uri "http://example.com/.well-known/acme-challenge/test" -UseBasicParsing
5.2 证书续期失败
我遇到过的典型问题及解决方案:
-
问题1:续期时提示权限不足
解决:以管理员身份运行Win-ACME -
问题2:Nginx配置未自动重载
解决:在Win-ACME的"任务命令"设置中添加:code复制nginx -s reload -
问题3:通配符证书续期失败
解决:确保DNS解析正确,必要时改用DNS-01验证方式
6. 高级配置技巧
6.1 多域名证书管理
对于需要管理多个域名的情况,建议使用Win-ACME的配置文件模式。创建config.json:
json复制{
"Certificates": [
{
"HostNames": ["example.com", "www.example.com"],
"Nginx": {
"KeyPath": "C:\\nginx\\conf\\ssl\\example.key",
"FullChainPath": "C:\\nginx\\conf\\ssl\\example.pem"
}
},
{
"HostNames": ["api.example.com"],
"Nginx": {
"KeyPath": "C:\\nginx\\conf\\ssl\\api.key",
"FullChainPath": "C:\\nginx\\conf\\ssl\\api.pem"
}
}
]
}
然后运行:
powershell复制.\wacs.exe --config=C:\path\to\config.json
6.2 证书监控告警
通过PowerShell脚本监控证书过期时间并发送告警:
powershell复制$cert = Get-ChildItem -Path "C:\nginx\conf\ssl\fullchain.pem"
$expiryDate = $cert.NotAfter
$daysLeft = ($expiryDate - (Get-Date)).Days
if ($daysLeft -lt 7) {
# 发送邮件告警
Send-MailMessage -From "admin@example.com" -To "alert@example.com" `
-Subject "证书即将过期警告" `
-Body "证书将在$daysLeft天后过期,请立即处理!" `
-SmtpServer "smtp.example.com"
}
可以将此脚本加入计划任务,每周运行一次。
7. 性能优化建议
7.1 OCSP Stapling配置
在Nginx配置中添加:
nginx复制ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate C:\nginx\conf\ssl\fullchain.pem;
resolver 8.8.8.8 valid=300s;
resolver_timeout 5s;
验证配置是否生效:
bash复制openssl s_client -connect example.com:443 -status -servername example.com
7.2 HTTP/2启用
在Nginx的SSL配置后添加:
nginx复制listen 443 ssl http2;
测试HTTP/2是否生效:
powershell复制(Invoke-WebRequest -Uri "https://example.com" -UseBasicParsing).Headers["X-Protocol"]
8. 安全加固措施
8.1 密钥文件权限设置
执行以下PowerShell命令保护密钥文件:
powershell复制$acl = Get-Acl "C:\nginx\conf\ssl\private.key"
$acl.SetAccessRuleProtection($true, $false)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("Administrators","FullControl","Allow")
$acl.AddAccessRule($rule)
Set-Acl -Path "C:\nginx\conf\ssl\private.key" -AclObject $acl
8.2 HSTS头配置
在Nginx的SSL server块中添加:
nginx复制add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
注意:一旦启用HSTS,在max-age期限内浏览器将强制使用HTTPS。测试阶段建议设置较短的max-age值。
9. 备份与恢复策略
9.1 证书备份方案
创建自动备份脚本backup-certs.ps1:
powershell复制$date = Get-Date -Format "yyyyMMdd"
Compress-Archive -Path "C:\nginx\conf\ssl" -DestinationPath "C:\backups\ssl-backup-$date.zip"
# 上传到远程存储
aws s3 cp "C:\backups\ssl-backup-$date.zip" s3://your-bucket/ssl-backups/
设置计划任务每月运行一次。
9.2 灾难恢复流程
恢复证书的步骤:
- 停止Nginx服务
- 解压备份文件到原路径
- 验证文件权限
- 重启Nginx
恢复验证命令:
powershell复制nginx -t
Start-Service nginx
Test-NetConnection -ComputerName localhost -Port 443
10. 替代方案对比
10.1 与IIS集成的比较
虽然Win-ACME也支持IIS,但Nginx方案有以下优势:
- 性能更高(特别是在静态文件服务场景)
- 配置更灵活
- 资源占用更低
- 跨平台兼容性更好
10.2 与其他ACME客户端对比
| 工具名称 | Windows支持 | Nginx支持 | 通配符证书 | 自动化程度 |
|---|---|---|---|---|
| Win-ACME | 原生支持 | 优秀 | 支持 | 高 |
| certbot | 需要WSL | 良好 | 支持 | 中 |
| acme.sh | 需要Cygwin | 一般 | 支持 | 低 |
| Lego | 需要Go环境 | 良好 | 支持 | 中 |
从实际使用体验来看,Win-ACME在Windows环境下的易用性和稳定性明显优于其他方案。
