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