我有来自第三方的自签名证书(.cer)文件。我想在代码中使用该证书连接到他们的web服务(通过HTTPS),而不是在Windows的我的证书库中安装它。具体而言,这是团队中的所有其他开发人员不必在本地安装此证书,以便连接为他们工作。
有没有办法在代码中执行此操作?它可以使用老式的Web服务客户端代码(使用wsdl.exe或VS的添加Web引用)或WCF客户端代码(使用svcutil.exe或VS的添加服务引用) - 我们没有确定我们想要去哪种方式爱好。
我试过了:
proxy.ClientCertificates.Add(X509Certificate.CreateFromCertFile(@"d:\temp\mycert.cer"));
使用旧式的Web服务代码,没有运气 - 它仍然在Could not establish trust relationship for the SSL/TLS secure channel.
失败,直到我在证书库中实际安装证书。同样的事情:
<identity>
<certificate encodedValue="the base64 encoded contents of the file" />
</identity>
使用WCF客户端技术在app.config中的端点。
由于
答案 0 :(得分:3)
您需要证书的原因是HTTPS。 Web服务由传输安全性(HTTPS)保护,证书不受您系统信任。要信任证书,通常的方法是将证书安装到认证存储区。这一切都不是.NET功能 - 它是.NET职责之外的Windows功能。
要信任任意SSL证书.NET提供了回调方法,您可以在其中创建自己的代码来验证证书:ServicePointManager.ServerCertificateValidationCallback
。如果您只是从回调中返回true,那么您将信任每个证书,但这仅用于开发和测试!部署到生产应用程序后,应使用证书存储中的证书或使用回调中定义的特定验证(不推荐)。
答案 1 :(得分:1)
.NET不能/不会从纯文本文件处理证书+密钥组合(在这种情况下需要)。我还没有办法建造一个;它没有读取证书的明文密钥。
然而,即使容器没有密码,也可以使用P12 / PFX容器。您甚至可以将其存储为编码字符串,并通过以下构造函数重新构建它:http://msdn.microsoft.com/en-us/library/ms148418.aspx