gpt4 book ai didi

.net - .NET应用程序无法发送客户端证书-Win 7 vs Win XP?

转载 作者:太空宇宙 更新时间:2023-11-03 12:38:37 27 4
gpt4 key购买 nike

我正在开发一个使用HttpWebRequest将请求发送到另一台服务器的ASP.NET Web应用程序。它通过HTTPS发送请求,并且远程服务器需要客户端证书。该请求在.NET应用程序中失败,显然无法发送正确的客户端证书。如果我仅使用Web浏览器(专用于Chrome)访问url,就能够成功连接并发送客户端证书。
下面的代码是简单的复制,仅带有基本的GET请求。

var r = WebRequest.Create(url) as HttpWebRequest;
r.ClientCertificates = new X509CertificateCollection { myX509Cert };
using (var resp = r.GetResponse() as HttpWebResponse) {
...
}
我得到了我们最喜欢的异常(exception),“无法创建SSL / TLS安全通道”。通常,这些类型的问题指向证书私钥权限的问题。我尽力确保所有配置正确,但是我可能错过了一些东西。长话短说,远程服务器正在发送TLS CertificateRequest,该列表带有似乎可以正确识别我的客户端证书的列表,但是我的应用程序无法使用任何客户端证书进行响应。
这是我的设置:
  • Windows 7专业版64位
  • 能够在Visual Studio开发服务器中运行的ASP.NET MVC 3 / .NET 4应用程序,在本地IIS中运行的ASP.NET WebForms / .NET 3.5应用程序以及.NET控制台应用程序/ .NET中重现该问题4
  • Microsoft .NET Framework 4.5最近已安装。尚未检查这是否可能是一个问题

  • 这是我尝试过的所有内容,以及我所知道的:
  • 在Windows XP计算机上运行时,此代码似乎可以正常工作
  • 我确保将我的客户端证书导入本地计算机的“个人证书”存储中,并为自己和所有相关IIS用户正确配置了“私钥”权限
  • 我尝试几次在计算机上重新安装证书
  • 我已经确认.NET应用程序可以访问X509证书,并且HasPrivateKey = true
  • 确保我的客户证书有效。实际上,这是将在其上运行
  • 的Web服务器的SSL证书
  • 我在请求对象中设置了PreAuthenticate = true。没有影响
  • 我尝试设置 ServicePointManager.Expect100Continue = false ,对
  • 没有影响
  • 我尝试设置ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3,但显然远程服务器需要TLS,因此对
  • 没有帮助
  • 我将ServicePointManager.ServerCertificateValidationCallback委托(delegate)设置为始终返回true。但是请求在TLS握手中更早就失败了,甚至没有达到调用此委托(delegate)
  • 的地步
  • 当我转到Chrome中的URL时,它要求我提供客户端证书,提供正确的客户端证书作为选择,然后选择该证书,然后得到有效的响应。当我在Fiddler中构造请求时,也可以正常工作。因此,这肯定是我的.NET代码所特有的问题,而不是证书本身或远程服务器等问题。
  • 与我合作的供应商在不同的远程服务器上设置了相同的服务,并且该服务需要不同的客户端证书。因此,我尝试使用不同的URL和客户端证书进行相同的操作,并得到相同的失败

  • 我添加了 System.Net trace并看到了:

    SecureChannel#26717201 - We have user-provided certificates. The server has specified 6 issuer(s). Looking for certificates that match any of the issuers.

    SecureChannel#26717201 - Left with 0 client certificates to choose from.

    ...

    InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=CertUnknown).


    我启用了完整的 SCHANNEL logging,并看到以下警告:

    The remote server has requested SSL client authentication, but no suitable client certificate could be found. An anonymous connection will be attempted. This SSL connection request may succeed or fail, depending on the server's policy settings.


    我运行Wireshark,看到远程服务器发送了一个 CertificateRequest,它似乎有一个 Distinguished Name条目,其中精确指定了我的客户端证书的CN \ OU \ O值。之后,我的应用程序发送一个没有证书的证书响应。
    似乎我没有设置此证书才能与Windows 7中的.NET应用程序一起正常工作。我的最佳猜测是,与XP计算机相比,新的Windows 7计算机与Windows 7计算机有所不同,这导致现在失败。我目前无法使用Windows XP环境进行确认。我会过几天,但我真的很想尽快解决此问题。
    任何想法将不胜感激。谢谢!
    编辑如上所述,在Chrome中连接到URL时,浏览器会要求我提供客户端证书,并且我可以提供正确的证书并成功连接。但是,我无法在Internet Explorer(9)中成功完成此操作。我只是得到“Internet Explorer无法显示网页”,没有其他提示或解释。有人告诉我这可能是相关的,因为 WebRequest.Create与IE具有相似的行为。我正在研究这可能意味着什么,但会对此有任何想法。
    编辑另外,我应该注意远程服务器使用自签名SSL证书。我最初以为可能是问题所在,所以我在MMC中将证书添加为受信任的根,以便证书在我的计算机上显示为有效。这不能解决问题。

    最佳答案

    原来这是一个相当简单的问题,但很难发现。我的应用程序所在的远程服务器的密钥库中有我的客户证书,但我的客户证书的信任链中没有任何根证书。

    我能够使用我的代码成功地将请求发送到需要客户端证书的其他服务器。发送此成功请求时,我在Wireshark中进行了捕获,同时还将失败的请求发送至另一台服务器时进行了捕获。在Wireshark捕获中,我找到了“服务器Hello”并比较了从远程服务器发送的消息。 “良好”的远程服务器正在发送我的客户端证书以及该消息的“证书请求”部分中的根证书。 “故障”远程服务器仅发送我的客户端证书。

    这使我想起System.Net诊断跟踪显示为“服务器已指定6个颁发者...剩下0个客户端证书可供选择”。因此,事实证明“发行人”是这里的关键术语。最初很容易忽略,因为在我对TLS握手的初步分析中,服务器正在证书请求中发送我的客户端证书。事后看来,服务器应该发送您的根证书,而不是客户端证书本身,这是有道理的。

    关于.net - .NET应用程序无法发送客户端证书-Win 7 vs Win XP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9858275/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com