System.Net.WebRequest不显示我的证书

问题描述:

下面是我编写的代码片段,用于向我们拥有的内部Web服务发出SOAP请求。如果我使用Fiddler运行Fiddler来提醒该网站正在申请证书。如果我向Fiddler提供这个证书,它可以很好地运行。如果我关闭Fidler,则会出现连接已关闭的错误。因为我正在将证书添加到ClientCertificates集合中,所以我正在殴打我的头,而当我调试它时,我可以看到它具有它。任何想法为什么它不会在运行时显示它? (你会看到我已经从本地计算机存储抓住它并从文件创建它测试,两个选项都没有工作)System.Net.WebRequest不显示我的证书

  $cert = [System.Security.Cryptography.X509Certificates.X509Certificate2]::CreateFromCertFile($certPath) 
      #$cert = get-item cert:\LocalMachine\* | get-ChildItem | Where-Object -FilterScript {($_.FriendlyName -eq "HRSYS")} 
      $soapWebRequest = [System.Net.WebRequest]::Create($url) 
      $soapWebRequest.ClientCertificates.Add($cert) 
      $soapWebRequest.Headers.Add("SOAPAction", "http://service.wellsfargo.com/provider/hr/entity/teamMemberData/getTeamMemberProfileById/2010/12/") 
      $soapWebRequest.ContentType = "text/xml;charset=`"utf-8`"" 
      $soapWebRequest.Accept = "text/xml" 
      $soapWebRequest.Method = "POST" 
      $soapWebRequest.Timeout = 60000 
      $soapWebRequest.UseDefaultCredentials = $true 

看起来X509Certificate2.CreateFromCertFile被设计成只加载一个证书,不是私钥的证书,这是您需要使用客户端证书的证书。

X509Certificate2是模拟X.509证书的类,但也有能力将私钥与其相关联(私钥不是证书的一部分,但需要使用证书进行身份验证)。

使用X509Certificate2(String, SecureString)构造函数可以更好地从PKCS#12文件及其密码加载证书。

请注意,即使您的客户端成功发送客户端证书,使用Fiddler作为MITM SSL/TLS代理也会使客户端证书身份验证失败。这是因为Fiddler会提供不是服务器发送的真正证书的服务器证书,从而产生不同的握手。由于客户端证书认证依赖于客户端签署整个握手的摘要,以便服务器可以将其与自己的握手帐户进行比较,并且由于客户端和服务器所看到的握手会在MITM代理服务器使用,客户端证书认证将失败。

+0

我做了一些测试,看来你是对的。当我从文件创建证书时,它似乎没有私钥。我现在从本地机器商店获得它,现在它肯定有私钥,但是我仍然在“底层连接已关闭:接收时发生意外错误”。我采取了网络跟踪,最后一次重置是从我的机器到服务器,所以我现在想知道是否我的机器拒绝服务器的证书。我认为这条线会抓住它? [System.Net.ServicePointManager] :: ServerCertificateValidationCallback = {$ true} – user1636358

+0

由于您似乎正在使用默认的可信证书存储,所以如果IE对该服务器证书没有问题,那么您的脚本也应该如此。通常避免使用'ServerCertificateValidationCallback = {$ true}',因为它会禁用信任验证。正如我所说,如果有MITM代理(提琴手或其他),这些都不会起作用。也许值得用Wireshark来看看:如果你超越了握手(加密的应用程序数据包),那么服务器证书不应该成为问题。 – Bruno

+0

对我的测试来说,我没有提琴手在跑。我做了一个网络跟踪,它看起来像最后一次重置来自我的机器到服务器,这就是为什么我想知道它是否是证书回来。感谢您的帮助。对话非常有帮助。 – user1636358

我找到了我的答案。我必须授予私钥的权限。为了测试我的欺骗行为,并将其添加给所有人。

C:\ Program Files文件(x86)的\ Windows资源工具包\工具> winhttpcertcfg.exe -g -c “LOCAL_MACHINE \我的” -s HRSYS -a大家