AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 946277
Accepted
Chris J
Chris J
Asked: 2018-12-22 06:18:03 +0800 CST2018-12-22 06:18:03 +0800 CST 2018-12-22 06:18:03 +0800 CST

在 IIS 上调试客户端证书问题

  • 772

我们设置了一个 2008R2 IIS 服务器,其中一个站点配置为需要客户端证书。我们的测试客户端不工作,我们正在尝试调试原因。

在此过程中,我们设置了一个新的 Server 2008 R2 机器(是的,我知道它很旧,但这是运行该软件的机器)来尝试复制或确定排除故障的方法。

我们正在研究的一种方法是 TLS 握手。测试应用程序是用 .NET 编写的,并且System.Diagnostics启用了适当的调试,这会将以下条目放在日志文件中:

System.Net 信息:0:[22724] SecureChannel#48979325 - 我们有用户提供的证书。服务器已指定 10 个颁发者。寻找与任何颁发者匹配的证书。

我们看不到这个发行者列表,所以我们破解了 OpenSSL。运行以下命令:

openssl s_client -connect win2k8r2-1.hsl10690.test:443 -state -no_ticket -servername win2k8r2-1.hsl10690.test

导致输出表明:

   [...]
-----END CERTIFICATE-----
subject=/CN=testcert.hsl10690.test
issuer=/CN=Internal Dev CA 1
---
No client certificate CA names sent
---
SSL handshake has read 1013 bytes and written 329 bytes
   [...]

所以我们有一个不匹配的地方,微软堆栈声明服务器指定了 10 个颁发者,但 OpenSSL 报告服务器没有发送任何 CA 名称。

对于实时系统,System.Diagnostics 日志报告服务器指定的 130 多个颁发者,但 OpenSSL 仍然返回零。

我们认为问题在于我们提供的客户端证书与其中一个颁发者不匹配(但我们已经验证根在服务器的信任库中,并且我们已经在服务器外部验证了证书)。在实时服务器上,我们在“服务器已指定... ”消息之后的日志中看到了这一点:

System.Net Information: 0 : [36484] SecureChannel#33675143 - We have user-provided certificates. The server has specified 133 issuer(s). Looking for certificates that match any of the issuers.
    ProcessId=20372
    DateTime=2018-12-20T13:33:39.9042036Z
System.Net Information: 0 : [36484] SecureChannel#33675143 - Left with 0 client certificates to choose from.
    ProcessId=20372
    DateTime=2018-12-20T13:33:39.9052036Z

在进行测试时,如果一切正常,它会说:

System.Net Information: 0 : [22724] SecureChannel#48979325 - We have user-provided certificates. The server has specified 10 issuer(s). Looking for certificates that match any of the issuers.
    ProcessId=22100
    DateTime=2018-12-21T13:52:23.3718249Z
System.Net Information: 0 : [22724] SecureChannel#48979325 - Selected certificate: [Version]
  V3

[Subject]

我们如何找出服务器返回了哪些证书,如果我们发现颁发者从列表中丢失,是什么阻止了根被包含在内?我不排除我们错过了一些明显的东西,但我们还没有看到它。

windows
  • 1 1 个回答
  • 1864 Views

1 个回答

  • Voted
  1. Best Answer
    Chris J
    2019-12-31T11:59:00+08:002019-12-31T11:59:00+08:00

    我们终于找到了答案:错误是 KB931125。一篇博客文章将 KB 描述为仅用于客户端目标,但被发送到服务器,导致 IIS 发送的 CA 列表被截断。它并没有真正解释为什么我们无法使用 OpenSSL 看到传输的 CA 列表,但最终它确实让我们找到了根本原因。

    博客文章指向另一篇 MSDN 文章,该文章更详细地描述了该问题:

    如果 TLS/SSL 服务器在受信任的根证书列表中包含许多条目,则可能会出现这些问题。如果满足以下条件,服务器将向客户端发送受信任的证书颁发机构列表:

    • 服务器使用传输层安全 (TLS)/SSL 协议来加密网络流量。
    • 在身份验证握手过程中需要客户端证书进行身份验证。

    此受信任证书颁发机构列表表示服务器可以接受客户端证书的颁发机构。要由服务器进行身份验证,客户端必须具有证书链中存在的证书到服务器列表中的根证书。这是因为客户端证书始终是链末端的最终实体证书。客户端证书不是链的一部分。

    目前,在 Windows Server 2008、Windows Server 2008 R2 和 Windows Server 2012 中,Schannel 安全包支持的受信任证书颁发机构列表的最大大小为 16 KB。

    还记录了一个事件日志条目,上面写着(我们第一次看到这个时错过了):

    当请求客户端身份验证时,此服务器会向客户端发送受信任的证书颁发机构列表。客户端使用此列表来选择服务器信任的客户端证书。目前,该服务器信任的证书颁发机构太多,以至于列表变得太长。因此,此列表已被截断。这台机器的管理员应该审查信任的证书颁发机构进行客户端身份验证,并删除那些实际上不需要信任的证书颁发机构。

    MSDN 文章确实列出了一个修复:

    删除以下注册表项:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\AuthRoot\Certificates

    为此,请按照下列步骤操作:

    1. 启动注册表编辑器
    2. 找到以下注册表子项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\AuthRoot
    3. 右键单击然后删除名为“证书”的密钥
    • 2

相关问题

  • 知道任何适用于 Windows 的快速可编写脚本的 ftp 客户端吗?[关闭]

  • 如果 Windows 服务崩溃,如何自动重新启动它?

  • 无法安排任务(访问被拒绝)

  • 物理机重启时自动重启虚拟机(VMWare)

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve