我正在尝试调用一个网络服务(不是我的),在 Visual Studio 2008 中对其进行服务引用。根据它的所有者的说法,它需要一个证书,他们出于测试目的提供了该证书。
我在证书、SSL 和其他方面绝对是个新手,所以我可能会在这里做一些非常错误的事情。无论如何,这就是我所做的。
首先,我在我的客户端机器上注册了 P12 文件及其密码(也已提供)。 然后,我使用 VS2008 中的服务引用选项引用该服务,并指向它们的 URL(顺便说一句,使用 VPN 隧道)以便在 Windows 窗体应用程序中调用它。它们的所有底层方法都被生成的程序集识别。
这是我使用的代码:
WebServiceClient client = new WebServiceClient();
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2 certificate = store.Certificates[0];
client.ClientCredentials.ClientCertificate.Certificate = certificate;
client.ReturnSomeData(); //Error here
在最后一行,抛出以下异常:
Could not establish trust relationship for the SSL/TLS secure channel with authority '<webservice URI here>'
内部异常同样有两层深,第三层是
The remote certificate is invalid according to the validation procedure
问题是,我可以在 SoapUI 上使用那个证书调用那个方法,然后返回数据。
此外,我还看到了 Marc Gravel 发布的疑难解答 here , 所以...
- 您有服务器的 DNS 和视线吗? 是
- 您使用的证书名称是否正确? 是,我用 Immediate 检查过了。
- 证书是否仍然有效? 希望。如果 SoapUI 接受了它,我想是吗? (这里真的有我的疑惑)
- 是不是配置不当的负载均衡器把事情搞砸了? 也没有解释 SoapUI 的行为。
- 新服务器机器的时钟设置是否正确(即 UTC 时间是否正确 [忽略本地时间,这在很大程度上是无关紧要的])——这对 WCF 来说当然很重要,所以可能会影响常规 SOAP? 不知道是否适用。
- 是否存在证书信任链问题?如果你从服务器浏览到soap服务,你能得到SSL吗? 实际上,有。 Chrome 报告
无法确认该网站的身份
。我认为这是因为我们在这里使用 VPN 连接。有问题吗? - 服务器的机器级代理设置是否正确? (与用户的代理不同);请参阅 proxycfg for XP/2003(不确定 Vista 等)同样,不会解释 SoapUI 的行为。
非常感谢任何帮助。
最佳答案
我成功地收到了直接从 .p12 文件导入的证书。 以下代码
X509Certificate2 certificate = new X509Certificate2();
certificate.Import(@"<FilePath>",password,X509KeyStorageFlags.DefaultKeySet);
client.ClientCredentials.ClientCertificate.Certificate = certificate;
client.ReturnSomeData();
是成功的,所以我现在坚持使用这个解决方案。不太理想,不过看这事急,待会再改。
仍然不是一个明确的答案,尽管这可能对遇到类似问题的人有所帮助。
更新
我想我明白了为什么这回答了这个问题。 因此,事实证明,我从商店检索证书的方式仍然有问题。直接导入它可确保证书存在,但客户端连接需要一些额外的步骤。
首先,在绑定(bind)中定义传输模式。
<binding name="<bindingName>">
<security mode="Transport" >
<transport clientCredentialType="Certificate" />
</security>
</binding>
其次,确保 ServerCertificateValidationCallBack
回调执行正确的验证。看起来很糟糕,
ServicePointManager.ServerCertificateValidationCallback +=
(sender, x509Certificate, chain, errors) => true;
将用于非生产目的。
关于.net - 使用证书访问 .NET Framework 中的 Web 服务时无法建立信任连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35022908/