.net - 使用证书访问 .NET Framework 中的 Web 服务时无法建立信任连接

标签 .net ssl x509

我正在尝试调用一个网络服务(不是我的),在 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 , 所以...

  1. 您有服务器的 DNS 和视线吗?
  2. 您使用的证书名称是否正确? ,我用 Immediate 检查过了。
  3. 证书是否仍然有效? 希望。如果 SoapUI 接受了它,我想是吗? (这里真的有我的疑惑)
  4. 是不是配置不当的负载均衡器把事情搞砸了? 也没有解释 SoapUI 的行为。
  5. 新服务器机器的时钟设置是否正确(即 UTC 时间是否正确 [忽略本地时间,这在很大程度上是无关紧要的])——这对 WCF 来说当然很重要,所以可能会影响常规 SOAP? 不知道是否适用。
  6. 是否存在证书信任链问题?如果你从服务器浏览到soap服务,你能得到SSL吗? 实际上,有。 Chrome 报告无法确认该网站的身份。我认为这是因为我们在这里使用 VPN 连接。有问题吗?
  7. 服务器的机器级代理设置是否正确? (与用户的代理不同);请参阅 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/

相关文章:

encryption - 在 ssl 之上的应用层加密数据

c# - Bouncy CaSTLe 的 X509V3CertificateGenerator.SetSignatureAlgorithm 标记为已过时。我该怎么办?

algorithm - 如何在 OpenSSL 中为 X.509 证书使用不同的加密算法?

go - crypto/tls软件包中的自定义VerifyPeerCertificate

c# - 在 .NET 中指定 UDP 多播应该转到的网络接口(interface)

c# - 虚拟主机.exe。为什么需要这个?

iphone - iphone 应用程序的 SSL Wrapper

c# - pinvoke:如何释放包含 LPWSTR 的结构数组

.net - Web API 缓存

android - 使用 ssl 的 phonegap 中的文件上传问题