必须以管理员身份运行powershell,用new-selfsignedcertificate命令生成含localhost、ip和域名的san证书,并导入root存储后执行certutil -generatesstfromwu刷新缓存,才能使windows信任该证书。

在Windows 11中为本地Web服务、测试API或内部HTTPS站点快速生成可信任的SSL证书,必须使用PowerShell内置的New-SelfSignedCertificate命令——它无需安装OpenSSL,不依赖外部工具,且原生支持Subject Alternative Name(SAN)扩展,避免浏览器提示“您的连接不是私密连接”。
生成带IP和域名的自签名SSL证书
这一步必须以管理员身份运行PowerShell,否则证书无法写入LocalMachine\My存储,后续IIS或WinRM绑定将失败。
执行以下命令:
New-SelfSignedCertificate -DnsName "localhost", "192.168.1.100", "dev.internal" -KeyAlgorithm RSA -KeyLength 2048 -CertStoreLocation "Cert:\LocalMachine\My" -NotAfter (Get-Date).AddYears(2) -HashAlgorithm SHA256
命令中-DnsName参数同时指定多个标识:localhost用于开发调试,IP地址用于局域网设备访问,自定义域名如dev.internal便于模拟真实环境。若只填一个值(如仅"192.168.1.100"),Chrome/Firefox新版会直接拒绝建立HTTPS连接,【必须包含localhost或DNS可解析名】。
执行后记下控制台输出的Thumbprint(指纹),形如A1B2C3...F9,后续绑定和导出都依赖它。
将证书导出为PFX文件供Nginx/Apache使用
方法一:用证书指纹精确导出(推荐)
先获取证书对象:
$cert = Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Thumbprint -eq "A1B2C3...F9"}
再导出为带密码的PFX:
$pwd = ConvertTo-SecureString -String "MyPass123!" -Force -AsPlainText
Export-PfxCertificate -Cert $cert -FilePath "C:\ssl\server.pfx" -Password $pwd
方法二:按时间筛选最新证书(适合批量脚本)
Get-ChildItem Cert:\LocalMachine\My \| Where-Object {$_.FriendlyName -eq "" -and $_.NotAfter -gt (Get-Date)} \| Sort-Object NotAfter -Descending \| Select-Object -First 1 \| Export-PfxCertificate -FilePath "C:\ssl\latest.pfx" -Password (ConvertTo-SecureString "temp" -Force -AsPlainText)
注意:导出路径C:\ssl\需提前手动创建,否则报错“找不到路径”。PFX密码必须用SecureString传递,明文写入脚本会触发PowerShell执行策略拦截。
让Windows系统信任该证书(客户端免警告)
第一步:复制证书到受信任的根证书颁发机构
$cert = Get-ChildItem Cert:\LocalMachine\My \| Where-Object {$_.Thumbprint -eq "A1B2C3...F9"}
$destStore = New-Object System.Security.Cryptography.X509Certificates.X509Store "Root", "LocalMachine"
$destStore.Open("ReadWrite")
$destStore.Add($cert)
$destStore.Close()
第二步:强制刷新证书信任状态(关键)
certutil -generateSSTFromWU
这一步不能跳过。仅导入Root存储后,部分应用(如Edge 129+、curl 8.10+)仍会校验Windows Update根证书列表缓存,不执行certutil命令会导致“NET::ERR_CERT_AUTHORITY_INVALID”错误持续存在。
第三步:验证是否生效
在浏览器中访问https://192.168.1.100:8443,不再弹出“不安全”警告即成功。











