Windows Server 2025 / 配置 IIS HTTPS 并从客户端核验证书

IIS HTTPS 需要与请求名称匹配的证书、服务器上的对应私钥,以及使用该证书的 HTTPS 绑定。还要核对客户端信任、有效期、吊销检查条件和实际提供的证书,尤其是在续订之后。

分别核对名称、私钥、信任与绑定

HTTPS 使用传输层安全协议(Transport Layer Security,TLS)保护 HTTP 流量。服务器提供把身份与公钥关联的证书,客户端验证名称、有效期与信任链;私钥保留在服务器,用来证明对相应密钥的持有。使用者可选名称(Subject Alternative Name,SAN)是列出适用名称的证书扩展,本课应包含 web.lab.example.test。

项目 实验检查
名称 SAN 中包含 web.lab.example.test。
存储 WEB1 → 本地计算机 → 个人。
私钥 对应私钥已关联,且服务实际可用。
信任 CLIENT1 在所用上下文信任预期证书链。
绑定 LabSite / HTTPS / 8443 / 通过指纹确认的证书。

访问 IP 不等于访问名称。SAN 中的 DNS 名称 web.lab.example.test 不会自动涵盖 172.24.50.30。TLS 服务身份标准 RFC 9525采用 SAN 标识,不应仅凭 Common Name 一致就判定匹配。本课 .test 名称用于内部实验,实际服务需要组织控制的名称与适当的证书颁发机构(CA)。IIS HTTPS 指南区分证书准备和绑定设置,其中历史 SSL 示例并不是建议启用过时协议。

为隔离实验创建测试证书

先确认LabSite 与 web.lab.example.test正常,名称解析到 172.24.50.30,并能显示预期 HTTP 页面。只使用隔离的 WEB1 与 CLIENT1,不公开服务。本课自签名证书由自身签署,颁发者和主体对应同一证书,客户端不会自动信任它。它不能代替生产环境的签发、验证与密钥管理。更改前先记录绑定、规则以及两个证书存储的原状态。

在 WEB1 本机以管理员 Windows PowerShell 逐行执行。创建失败时停止,不使用 labCertificate 中可能残留的旧值。将新对象的 Thumbprint 指纹记录到会话之外。一个月有效期是本课选择;AddMonths(1) 表示一个日历月,不是 CA 策略,也不保证正好 30 天。New-SelfSignedCertificate说明了 SAN 中的 DNS 名称与计算机存储位置:

$labCertificate = New-SelfSignedCertificate -DnsName 'web.lab.example.test' -CertStoreLocation 'Cert:\LocalMachine\My' -FriendlyName 'LabSite HTTPS test' -NotAfter (Get-Date).AddMonths(1)
$labCertificate | Select-Object Subject,Thumbprint,NotAfter,HasPrivateKey

在 WEB1 打开 certlm.msc → 个人 → 证书,按已记录的准确指纹定位对象。检查 SAN、服务器身份验证用途、颁发者、日期和关联私钥。预期 HasPrivateKey = True,但它只表示存在关联的私钥,不保证服务实际能够使用。Windows 证书存储管理文档区分本地计算机和当前用户。重复实验前先查看已有对象,避免不断创建同名副本;友好名称不能唯一识别证书。

添加 8443 端口的 HTTPS 绑定

  1. 在 IIS 管理器 → WEB1 → 服务器证书刷新列表,找到新证书。与记录的指纹和日期核对,不只看友好名称。
  2. 打开 LabSite → 绑定 → 添加,选择 https、IP 172.24.50.30、端口 8443,先检查已有绑定组合或服务是否冲突。
  3. 输入 web.lab.example.test,选择“需要服务器名称指示”,不要误用 StatusSite 的名称。
  4. 选择 LabSite HTTPS test,确认与 WEB1 记录的指纹一致。找不到或缺少私钥时,检查存储和对象,不改选名称相似的证书。
  5. 核对完整组合、重复项与站点状态。本次实验保留 HTTP 8080 绑定不变,以便区分两种访问。
  6. 在 WEB1 确认域防火墙配置文件后,只有规则不存在时才创建 Lab-IIS-HTTPS-8443:wf.msc → 入站规则 → 新建规则 → 端口 → TCP、本地端口 8443 → 允许 → 仅域。在属性 → 作用域把远程 IP 限制为 172.24.50.0/24,并检查其他规则和策略,不扩大配置文件范围或关闭防火墙。

服务器名称指示(Server Name Indication,SNI)允许客户端在 TLS 协商时发送请求名称,在共享 IP 与端口时帮助选择证书。参阅绑定与 SNI 属性。本课用 8443 与 HTTP 8080 区分,常用 HTTPS 端口是 443。SNI 不会增加信任或修改 SAN,客户端不支持相关要求也不是关闭证书验证的理由。

从 CLIENT1 验证信任与实际证书

从 CLIENT1 打开 https://web.lab.example.test:8443/。在添加信任之前,本课自签名证书预期会出现警告,但警告也可能来自其他问题。不要通过忽略警告来声明成功,也不要输入凭据。如果浏览器允许在不继续访问的情况下查看证书,应与 WEB1 记录核对指纹、名称和有效期。指纹不同或无法识别时,应停止并检查绑定,而不是先导入信任。

  1. 在 WEB1 的 certlm.msc → 个人 → 证书,按指纹选中测试证书 → 所有任务 → 导出,选择“不导出私钥”,保存为公开 .cer 文件,使用新的名称和路径,不覆盖已有文件。
  2. 通过可信实验路径把该 .cer 传送到 CLIENT1。不创建或分发含私钥的 PFX;客户端需要公开证书,而不是服务器私钥。
  3. 打开公开文件,将指纹与通过可信渠道取得的 WEB1 记录比较,不依赖来源未知文件中的说明。也要核对名称和有效期,不一致就不要导入。
  4. 在 CLIENT1 以实际测试用户打开 certmgr.msc → 受信任的根证书颁发机构 → 证书 → 所有任务 → 导入,只选择已核验的 .cer,并确认“当前用户”和该目标存储。记录新增信任的指纹和范围,以便结束时删除;不导入生产电脑或通过域策略分发。
  5. 关闭并重新打开同一用户的浏览器,访问 https://web.lab.example.test:8443/,确认无证书警告、指纹正确且页面内容符合预期,而不只是打开了一个标签页。

添加根证书会改变该上下文的信任范围。只导入自己创建并核验的测试证书,不为消除提示而导入未知证书。仍失败时检查 SAN、客户端与服务器时间、有效期、实际提供的指纹,以及浏览器或组织策略。“当前用户”只影响该用户上下文,不能证明其他用户或服务使用同一存储。不要通过域策略分发本课测试信任,也不要为使实验成功而改到全局存储。

Test-NetConnection -ComputerName web.lab.example.test -Port 8443

TcpTestSucceeded: True 只证明 8443 的 TCP 连接建立成功,不验证 TLS 协商、名称、证书链或页面。在浏览器检查实际证书及证书路径,确认与记录相同的指纹和预期 LabSite 内容。“无警告并完成这些检查”与“忽略警告后继续”是不同结果。本课测试证书也不能证明真实 CA 的吊销检查已经正常工作。

续订和清理时检查绑定

把替代证书签发或导入存储,不保证 IIS 已经提供它。应检查新私钥可用性、名称、链、用途与有效期,更新目标站点绑定,再从独立客户端核对新指纹和页面。更改前记录旧指纹和旧绑定,保留旧证书直到依赖关系与回退需求明确;过期或已吊销证书不是有效回退目标。不要仅凭相同友好名称自动替换全部绑定。

  • 明确负责人、续订方式,以及签发或部署失败告警,不仅仅提醒到期日期。
  • 到期前为审批、安装、更新绑定和客户端验证预留时间。只有告警而没有处理负责人,并不构成完整流程。
  • 对于要求吊销检查的证书和策略,应保证真实吊销列表或状态响应位置可达;不要为本课自签名证书编造这些路径,也不要通过关闭全局检查来隐藏故障。
  • 自动化续订时也要监控绑定关联和实际提供的证书。存储出现新对象,不代表流量已经使用它。

清理时只移除 LabSite 新增的 HTTPS 绑定和 Lab-IIS-HTTPS-8443 规则。按指纹从 WEB1 → 本地计算机 → 个人移除测试证书前,先检查其他绑定或服务依赖。在 CLIENT1 打开 certmgr.msc,仅删除本课添加到当前用户 → 受信任的根证书颁发机构中的对应指纹条目。若某视图继承其他存储的条目,应先确认范围,不删除其他根证书或名称相似的证书。是否保留 HTTP 8080,或设计已验证的 HTTPS 重定向,需要另行决定;新增 HTTPS 不会自动重定向或删除 HTTP。