2

下面是我为向我们拥有的内部 Web 服务发出 SOAP 请求而编写的代码片段。如果我使用 Fiddler 运行此程序,运行 Fiddler 会提醒该站点正在请求证书。如果我向 Fiddler 提供证书,它会完美运行。如果我关闭 Fiddler,则会收到连接已关闭的错误消息。我正在撞墙,因为我将证书添加到 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
4

2 回答 2

2

我找到了我的答案。我必须授予私钥权限。为了测试,我作弊了,只是为大家添加了它。

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

于 2012-08-31T18:24:49.627 回答
1

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

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

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

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

于 2012-08-30T16:00:30.860 回答