我正在连接到托管在 Win2008 (IIS7) 中的 Web 服务,该服务需要基于证书的相互身份验证。当在 .NET 2.0 运行时上运行的客户端调用该服务时,操作失败并显示 403。如果我检查 wireshark 中的请求,我看到客户端正在响应 Certificate Request 框架Certificate 框架,但该框架中未指定证书。查看服务器在证书请求中提供的 CA 证书列表,客户端证书使用的 CA 不存在。这似乎是有道理的,因为如果服务不信任它,发送证书的意义何在。但是,当我使用针对 .NET 4.0 运行时重新编译的工具进行相同的调用时,行为是不同的。客户端的Certificate 框架确实包含它配置使用的证书。我在MSDN上看到对 SslStream 进行了更改,这就是我遇到的问题吗?令人不安的是,不同的运行时版本对同一服务端点的行为不同。
最佳答案
是的,两个运行时版本之间的行为确实发生了变化。细微的变化在于客户端如何处理证书请求帧。我们遇到的问题是由于a bad root certificate update,服务器在其受信任的根存储中有太多的 CA。问题。这导致在证书请求帧的证书数组中返回受信任的 CA 的子集。由于返回的 CA 列表是一个真子集,它包括在某些请求中签署客户端证书的根,而在其他请求中则不包括。 .NET 2.0 客户端通过不包括服务器提供的受信任授权集之外的证书来正确遵守 TLS 规范。 .NET 4.0 客户端遵循其配置方式并提供通过 WCF 配置指定的客户端证书。
关于.net - .NET 4 是否更改了证书请求框架在 TLS 中的应答方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15705726/