# IIS TLS 配置脚本生成器（PowerShell、Schannel）

> 生成加固 IIS 的 PowerShell 脚本：关闭 TLS 1.0/1.1、设置密码套件顺序、导入并绑定 PFX、添加 HSTS，适用于 Windows Server。

Source: https://ssl.sh/zh/tools/tls-config-generator/iis/
Last updated: 2026-11-10

生成一个 PowerShell 脚本：关闭旧协议、调整密码套件顺序、导入并绑定 PFX 证书、给 IIS 加上 HSTS。

[TLS 配置生成器](https://ssl.sh/zh/tools/tls-config-generator/)的 IIS 预设生成一个用于 Windows Server 的 PowerShell 脚本，它会设置 Schannel 接受哪些 SSL/TLS 版本、限制并排序密码套件、导入 PFX 证书、绑定到站点并加上 HSTS 头。用管理员身份运行 PowerShell 执行脚本，然后重启服务器。

## 示例：中级档（节选）

```powershell
$base = 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols'
function Set-Protocol([string]$Name, [bool]$Enabled) {
    foreach ($side in 'Server', 'Client') {
        $key = "$base\$Name\$side"
        New-Item -Path $key -Force | Out-Null
        New-ItemProperty -Path $key -Name 'Enabled' -Value ([int]$Enabled) -PropertyType DWord -Force | Out-Null
        New-ItemProperty -Path $key -Name 'DisabledByDefault' -Value ([int](-not $Enabled)) -PropertyType DWord -Force | Out-Null
    }
}
Set-Protocol 'SSL 3.0' $false
Set-Protocol 'TLS 1.0' $false
Set-Protocol 'TLS 1.1' $false
Set-Protocol 'TLS 1.2' $true
Set-Protocol 'TLS 1.3' $true

$suites = @('TLS_AES_256_GCM_SHA384', 'TLS_AES_128_GCM_SHA256',
    'TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384', 'TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256',
    'TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384', 'TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256')
Get-TlsCipherSuite | Where-Object { $suites -notcontains $_.Name } | ForEach-Object { Disable-TlsCipherSuite -Name $_.Name }
```

生成的完整脚本还会导入 `C:\certs\example.com.pfx`、创建带 SNI 的 https 绑定，并添加 `Strict-Transport-Security`。

## 国内环境说明

- 阿里云、腾讯云下载的 IIS 证书包里是 `.pfx` 和一个密码 txt 文件，可以直接给脚本用（运行时会提示输入密码）。手上只有 PEM 文件的，用 [PEM 转 PFX](https://ssl.sh/zh/tools/ssl-converter/pem-to-pfx/) 转换；Windows Server 2016 要勾选兼容模式。
- 等保测评和安全扫描常要求关闭 TLS 1.0/1.1 和弱密码套件，这个脚本正好覆盖这两项。

## 要求

- Windows Server 2016 或更新版本，IIS 10。TLS 1.3 需要 Windows Server 2022+。
- TLS PowerShell 模块（Windows Server 2016 及以后自带），用于密码套件相关命令。
- 带私钥和证书链的 PFX 文件。

## 运行之后

1. 重启 Windows：Schannel 在启动时读取协议设置。
2. 用 [SSL 检查](https://ssl.sh/zh/tools/ssl-checker/)测试站点，确认 TLS 1.0/1.1 被拒绝。
3. 如果某个程序连不上老服务器了，只重新打开对应协议的 Client 端。

## 常见错误

- **“提供给程序包的凭据未被识别”**：证书导入时没有带上私钥，或者应用程序池账号读不了私钥。
- **返回了错误的证书**：同一 IP 上另一个没有 SNI 的绑定优先了。所有 https 绑定都用 `-SslFlags 1`（SNI）。


## FAQ

**关闭 TLS 1.0/1.1 会影响别的东西吗？**

这些设置对整台机器生效，包括 .NET 程序、SQL Server 客户端发起的出站连接。老的 .NET Framework 程序可能需要设置 SchUseStrongCrypto，建议先在测试服务器上验证。

**Windows Server 2019 能用 TLS 1.3 吗？**

不能。Schannel 从 Windows Server 2022 和 Windows 11 开始支持 TLS 1.3。2019 上用中级档，实际只会提供 TLS 1.2。

**IIS 有原生的 HSTS 设置吗？**

IIS 10.0 版本 1709 及以后，每个站点有 hsts 配置元素。脚本用的是自定义响应头，所有 IIS 版本都适用。
