Windows

IIS 安装 SSL 证书教程

作者: · 最后核实

在 IIS 上安装 SSL 证书分四步:把 PFX 导入“本地计算机 → 个人”存储,确认中间证书已安装,添加带 SNI 的 443 端口 HTTPS 绑定,再用 URL Rewrite 把 HTTP 跳转到 HTTPS。适用于 Windows Server 2019、2022、2025 上的 IIS 10,IIS 管理器和 PowerShell 都能操作。

前提条件

需要服务器管理员权限,以及一张证书或申请证书的渠道。

  • 安装了 Web 服务器(IIS)角色和“IIS 管理脚本和工具”功能(提供 WebAdministration PowerShell 模块)的 Windows Server。
  • IIS 里已有在 80 端口提供服务的网站,例如 Default Web Site,主机名 example.com。
  • example.com 的 A/AAAA 记录指向服务器,例如 203.0.113.10;服务器在中国大陆的需已备案;Windows 防火墙和云服务器安全组放行 TCP 443。
  • CA 提供的 PFX 文件(含证书、中间证书和私钥),例如阿里云、腾讯云下载的 IIS 格式证书;或者能提交 CSR 的 CA 账户。

第一步:把证书导入计算机存储

IIS 只能绑定“本地计算机 → 个人”存储里带私钥的证书。已有 PFX 文件的,用管理员 PowerShell 导入:

$pfxPassword = Read-Host -AsSecureString "PFX password"
$cert = Import-PfxCertificate -FilePath C:\certs\example.com.pfx `
  -CertStoreLocation Cert:\LocalMachine\My -Password $pfxPassword
$cert.Thumbprint

需要 CSR 的,在 IIS 管理器 → 服务器节点 → 服务器证书 → 创建证书申请,通用名称填 example.com,选 RSA 2048 位,保存请求文件提交给 CA。CA 返回证书后,在同一台服务器上用“完成证书申请”导入,因为私钥一直留在这台机器上。在别处生成 CSR 可以用 CSR 生成器。

只有 PEM 文件(例如 Let's Encrypt 或云厂商的 Nginx 格式)的,先转换成 PFX,较老的 Windows 加 -legacy:

openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out example.com.pfx

也可以用 证书格式转换 在浏览器里转换。

第二步:确认中间证书已安装

IIS 会从本机“中级证书颁发机构”存储里查找并发送中间证书。PFX 不含中间证书时,导入 CA 提供的中间证书:

Import-Certificate -FilePath C:\certs\intermediate.cer -CertStoreLocation Cert:\LocalMachine\CA

怎么找到正确的中间证书见 安装中间证书。

第三步:添加 HTTPS 绑定

每个网站需要一条 443 端口的 https 绑定,勾选 SNI 后多个网站可以共用一个 IP。IIS 管理器里:选中网站 → 绑定 → 添加,类型选 https、端口 443、主机名 example.com,勾选“需要服务器名称指示”,再选择证书。也可以用 PowerShell:

Import-Module WebAdministration
New-WebBinding -Name "Default Web Site" -Protocol https -Port 443 -HostHeader "example.com" -SslFlags 1
$binding = Get-WebBinding -Name "Default Web Site" -Protocol https -HostHeader "example.com"
$binding.AddSslCertificate($cert.Thumbprint, "My")

第四步:HTTP 跳转 HTTPS

HTTP 跳转 HTTPS 靠微软的 IIS URL Rewrite(URL 重写)模块实现。先安装这个模块,再在网站的 web.config 里加规则:

<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="HTTP to HTTPS" stopProcessing="true">
          <match url="(.*)" />
          <conditions>
            <add input="{HTTPS}" pattern="^OFF$" />
          </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

保留 80 端口的绑定,跳转才有地方响应;不要勾选要求 SSL,它会让 HTTP 访问返回 403 而不是跳转。

验证

配置正确时,example.com 返回 CA 签发的证书,证书链完整,HTTP 请求永久跳转到 HTTPS。用 SSL 证书检查 检查网站,或在终端运行:

curl ssl.sh/example.com

在服务器上确认绑定和 HTTP.sys 使用的证书:

Get-WebBinding -Name "Default Web Site"
netsh http show sslcert hostnameport=example.com:443

自动续期

IIS 本身不会续期证书。用商业证书或云厂商免费证书时,每次到期前都要重复第一步和第三步;2026 年 3 月 15 日起公网证书最长 200 天(2027 年 3 月 15 日起 100 天,2029 年 3 月 15 日起 47 天),手动续期已经跟不上。可选方案:

  • 用 win-acme 申请 Let's Encrypt 证书,通过计划任务自动更新 IIS 绑定。
  • CA 支持 ACME 的(很多商业 CA 支持,需要 EAB 外部账户绑定),让 win-acme 对接该 CA 的 ACME 地址。

无论哪种方式,都把网站加到 ssl.sh 监控(开发中),绑定的证书快过期时能及时发现。

常见问题排查

  • 指定的登录会话不存在(A specified logon session does not exist):私钥缺失或在错误的存储里,把 PFX 重新导入“本地计算机 → 个人”。
  • 完成证书申请失败,或证书在列表里消失:CSR 是在另一台服务器上生成的,私钥不在这里,从原服务器导出 PFX 或重新生成 CSR。
  • 浏览器正常,其他客户端报证书链不受信任:缺少中间证书,见 缺少中间证书。
  • ERR_SSL_VERSION_OR_CIPHER_MISMATCH:没有与请求域名匹配的绑定,或 Schannel 与客户端没有共同支持的协议,见 ERR_SSL_VERSION_OR_CIPHER_MISMATCH。
  • 证书域名不匹配:绑定的主机名或证书 SAN 不包含访问的域名,见 NET::ERR_CERT_COMMON_NAME_INVALID。

常见问题

阿里云、腾讯云下载的 IIS 证书怎么用?

按第一步导入下载包里的 .pfx 文件,再按第三步绑定。云厂商的 IIS 格式下载包里通常是一个 .pfx 文件和一个保存密码的 .txt 文件,导入密码就是 txt 里的内容。

“需要服务器名称指示”这个选项有什么用?

勾选后 IIS 按客户端在 TLS 握手里发送的域名(SNI)选择证书,多个网站可以共用一个 IP 的 443 端口而使用不同证书。当前浏览器都会发送 SNI,PowerShell 里对应 -SslFlags 1。

绑定证书时提示“指定的登录会话不存在”怎么办?

证书的私钥不存在或无法访问,常见原因是导入到了“当前用户”存储,或只导入了不带私钥的 .cer 文件。把 PFX 重新导入到“本地计算机 → 个人”。

资料来源

  1. Microsoft Learn: How to Set Up SSL on IIS 7 or later
  2. Microsoft Learn: Import-PfxCertificate
  3. Microsoft Learn: Using the URL Rewrite Module
  4. CA/Browser Forum Ballot SC-081v3