首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >.NET应用程序无法发送客户端证书- Win 7 vs Win XP?

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

Stack Overflow用户
提问于 2012-03-25 14:10:53
回答 3查看 13.6K关注 0票数 20

我正在开发一个使用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) {
    ...
}

我得到了我们最喜欢的异常,“无法创建SSL/TLS安全通道”。通常,这些类型的问题指向证书的私钥上的权限问题。我尝试了我能想到的所有方法来确保这些配置都是正确的,但我可能遗漏了一些东西。长话短说,远程服务器正在发送一个带有列表的TLS CertificateRequest,该列表似乎确实正确地标识了我的客户端证书,但我的应用程序无法使用任何客户端证书进行响应。

下面是我的设置:

  • Windows7专业版64位
  • 能够在Visual Studio开发服务器中运行的ASP.NET MVC3/ .NET 4应用程序、本地IIS中运行的ASP.NET WebForms / .NET 3.5应用程序以及.NET控制台应用程序/ .NET 4
  • Microsoft .NET Framework4.5中重现该问题。我还没有检查这是否可能是一个问题

这是我尝试过的一切,以及我所知道的:

  • 在Windows XP计算机上运行时,此代码似乎工作正常。我确保客户端证书已导入到本地计算机的个人证书存储中,并为我自己和所有相关的IIS用户正确配置了私钥权限。
  • 我多次尝试在我的计算机上重新安装证书
  • 我已经确认.NET应用程序可以访问X509证书,并且HasPrivateKey =true< code >H219
  • 确保我的客户端证书有效。它实际上是用于web服务器的SSL证书,此应用程序将在其上运行
  • ,我在请求对象中设置了PreAuthenticate = true。我试着设置ServicePointManager.Expect100Continue = false
  • 没有用,我试着设置了ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3,但是显然远程服务器需要TLS,所以这对
  • 没有帮助,我设置了一个ServicePointManager.ServerCertificateValidationCallback委托,让它总是返回true。但是请求在TLS握手之前失败了,在它甚至到达调用这个delegate
  • When的点之前,我转到Chrome中的网址,它要求我提供客户端证书,提供正确的客户端证书作为选择,我选择该证书并得到有效的响应。当我在Fiddler中构造一个请求时也能正常工作。因此,这显然是我的.NET代码的问题,而不是证书本身或远程服务器等的问题。
  • 与我合作的供应商在不同的远程服务器上设置了相同的服务,并且该服务需要不同的客户端证书。因此,我用不同的URL和客户端证书尝试了相同的方法,并得到了相同的失败

我添加了System.Net trace,并看到了以下内容:

SecureChannel#26717201 -我们有用户提供的证书。服务器已指定6个颁发者。查找与任何颁发者匹配的证书。

SecureChannel#26717201 -剩下0个客户端证书可供选择。

..。

InitializeSecurityContext(入缓冲区count=2,出缓冲区length=0,返回的code=CertUnknown)。

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

远程服务器已请求SSL客户端身份验证,但找不到合适的客户端证书。将尝试匿名连接。此SSL连接请求可能成功,也可能失败,具体取决于服务器的策略设置。

我运行Wireshark,看到远程服务器发送了一个CertificateRequest,它似乎有一个Distinguished Name条目,其中包含我的客户端证书的CN\OU\O值。在那之后,我的应用程序发送一个不带证书的证书响应。

在设置此证书以在Windows7中与.NET应用程序正常工作时,我似乎遗漏了一些东西。我最好的猜测是,与XP机器相比,我的新Windows7机器上有一些不同的东西,导致现在失败。我目前无法访问Windows XP环境来确认这一点;我会在几天后确认,但我真的希望尽快解决这一问题。

任何想法都将不胜感激。谢谢!

编辑如上所述,当在Chrome中连接到URL时,浏览器要求我提供客户端证书,我可以提供正确的证书并成功连接。但是,我无法在Internet Explorer (9)中成功完成此操作。我只是看到"Internet Explorer无法显示网页“,没有其他提示或解释。有人告诉我,这可能是相关的,因为WebRequest.Create的行为与IE相似。我正在研究这可能意味着什么,但我会重视这方面的任何想法。

编辑另外,我应该注意到远程服务器使用自签名的SSL证书。我最初认为这可能是问题所在,所以我将证书添加为MMC中的受信任根,以便证书在我的计算机上显示为有效。这并没有解决问题。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9858275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档