System.Net.WebRequest不提供我的证书

时间:2012-08-30 14:44:12

标签: powershell ssl service web certificate

下面是我编写的一段代码,用于向我们拥有的内部Web服务发出SOAP请求。如果我使用Fiddler运行Fiddler警报,该网站正在请求证书。如果我向Fiddler提供证书,这将完美运行。如果我关闭Fidler然后我收到连接已关闭的错误。我正在敲打墙,因为我正在将证书添加到ClientCertificates集合中,当我调试它时,我可以看到它有它。任何想法为什么它不在运行时呈现它? (你会看到我测试的地方从本地机器商店抓取它并从文件中创建它,这两个选项都没有工作)

            $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

2 个答案:

答案 0 :(得分:2)

我找到了答案。我必须授予私钥的权限。为了测试我被骗了,只是为每个人添加了它。

C:\ Program Files(x86)\ Windows Resource Kits \ Tools> winhttpcertcfg.exe -g -c“LOCAL_MACHINE \ my”-s HRSYS -a Everyone

答案 1 :(得分:1)

看起来X509Certificate2.CreateFromCertFile只能加载证书,而不是带有私钥的证书,这是您使用客户端所需的证书。

X509Certificate2是一个模拟X.509证书的类,但也能够将私钥与之关联(私钥不是证书的一部分,尽管必须使用证书进行身份验证)。

使用X509Certificate2(String, SecureString)构造函数将是一个更好的方法来加载您的证书,从PKCS#12文件及其密码。

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