在本地开发或内网服务部署中,经常需要为 IIS 站点配置 HTTPS。虽然网上教程众多,但实际操作时往往会遇到 PowerShell 绑定报错、浏览器拒绝访问、openssl 命令找不到 等连环坑。
本文基于 Windows Server / Windows 10/11 环境,梳理了一套经过验证的完整流程,包含证书生成、IIS 绑定、防火墙放行及常见问题排查,建议收藏备用。
一、 前置准备:安装 OpenSSL
IIS 本身不支持直接生成 PFX 证书,我们需要借助 OpenSSL。
推荐安装方式(Winget)
打开 管理员 PowerShell:
winget install ShiningLight.OpenSSL.Light
⚠️ 关键提醒:安装完成后,必须完全关闭并重新打开 PowerShell 窗口,否则 openssl 命令无法识别。若重开后仍报错,需手动将 C:\\Program Files\\OpenSSL-Win64\\bin 添加到系统环境变量 PATH 中。
验证安装:
openssl version
# 预期输出:OpenSSL 3.x.x 或 4.x.x
二、 生成自签名证书(PFX)
1. 创建证书目录
New-Item –Path "C:\\Certs" –ItemType Directory –Force
cd C:\\Certs
2. 生成私钥与证书
# 生成私钥
openssl genrsa –out lan.key 2048
# 生成证书请求(按需修改 CN 和 IP)
openssl req –new –key lan.key –out lan.csr –subj "/CN=LAN HTTPS Cert"
# 签发证书(有效期 3650 天)
openssl x509 –req –days 3650 -in lan.csr –signkey lan.key –out lan.crt
3. 转换为 IIS 可用的 PFX 格式
openssl pkcs12 –export –out lan.pfx –inkey lan.key -in lan.crt –passout pass:YourPassword123
💡 请将 YourPassword123 替换为你自己的强密码,后续导入时需要用到。
三、 导入证书到 Windows 证书存储
使用 PowerShell 一键导入,避免 GUI 操作的路径歧义:
Import-PfxCertificate –FilePath "C:\\Certs\\lan.pfx" `
–CertStoreLocation Cert:\\LocalMachine\\My `
–Password (ConvertTo-SecureString –String "YourPassword123" –AsPlainText –Force) `
–Exportable `
–FriendlyName "LAN HTTPS Cert"
验证导入成功:
Get-ChildItem Cert:\\LocalMachine\\My | Where-Object { $_.FriendlyName -eq "LAN HTTPS Cert" }
确认返回结果中包含正确的 Thumbprint(指纹)。
四、 IIS 绑定 HTTPS(核心避坑步骤)
❌ 常见错误写法
很多教程推荐使用 New-ItemProperty -Name bindings -Value @{…},该命令在较新版本的 IIS/PowerShell 中会抛出 System.ArgumentException。请勿使用此方法!
✅ 正确绑定流程
1. 获取证书指纹
$thumbprint = (Get-ChildItem Cert:\\LocalMachine\\My |
Where-Object { $_.FriendlyName -eq "LAN HTTPS Cert" }).Thumbprint
# 安全检查:防止变量为空导致后续静默失败
if ([string]::IsNullOrEmpty($thumbprint)) {
Write-Host "❌ 未找到证书!请检查 FriendlyName" –ForegroundColor Red
exit
}
Write-Host "✅ 证书指纹: $thumbprint" –ForegroundColor Green
2. 创建 HTTPS 绑定
# 假设站点名为 "3D",端口 3000
New-WebBinding –Name "3D" –Protocol https –Port 3000 –IPAddress "*" –SslFlags 0
3. 关联证书(二选一)
方法 A:Set-WebBinding(推荐)
Set-WebBinding –Name "3D" –Protocol https –Port 3000 –IPAddress "*" `
–Thumbprint $thumbprint –SslFlags 0
方法 B:netsh(最可靠,绕过 PS 模块 Bug)
netsh http add sslcert ipport=0.0.0.0:3000 certhash=$thumbprint `
appid="{00000000-0000-0000-0000-000000000000}" certstorename=MY
五、 防火墙放行(解决“拒绝访问”)
IIS 绑定成功 ≠ 外部可访问。“拒绝访问”99% 是防火墙拦截导致的。
New-NetFirewallRule –DisplayName "IIS HTTPS 3000" `
–Direction Inbound –Protocol TCP –LocalPort 3000 `
–Action Allow –Profile Any
⚠️ 如果是云服务器(阿里云/AWS/Azure),还需在云控制台的安全组中放行 TCP 3000 端口。Windows 防火墙与云安全组是两层独立过滤,缺一不可。
六、 验证与排错清单
访问测试
| https://localhost:3000 | 浏览器提示证书不安全,点击继续后可访问 | 正常现象(自签名证书) |
| https://192.168.x.x:3000 | 同上 | 若“拒绝访问”→ 检查防火墙/安全组 |
| http://192.168.x.x:3000 | 403 或无响应 | 正常,未配置 HTTP 绑定 |
快速诊断命令
# 1. 检查站点状态
Get-Website –Name "3D" | Select-Object Name, State
# 2. 检查端口监听
netstat –ano | findstr ":3000"
# 3. 检查 SSL 绑定
netsh http show sslcert ipport=0.0.0.0:3000
# 4. 检查防火墙规则
Get-NetFirewallRule –DisplayName "IIS HTTPS 3000" | Select-Object Enabled, Action
七、 FAQ
Q1:浏览器显示“您的连接不是私密连接”?
这是自签名证书的正常表现。生产环境请使用 Let’s Encrypt 或商业 CA 签发的可信证书。本地测试点击“高级 → 继续访问”即可。
Q2:修改了证书后,IIS 仍然使用旧证书?
IIS 会缓存 SSL 绑定。执行以下命令刷新:
iisreset /noforce
# 或删除旧绑定后重新添加
netsh http delete sslcert ipport=0.0.0.0:3000
Q3:Light 版 OpenSSL 够用吗?
完全够用。Light 版仅包含命令行工具和基础 DLL,体积仅几 MB。Full 版包含 C/C++ 开发头文件,除非你要编译依赖 OpenSSL 的程序,否则无需安装。
如果本文解决了你的 IIS HTTPS 配置问题,欢迎点赞收藏!遇到其他报错请在评论区留言交流。
网硕互联帮助中心





评论前必须登录!
注册