在不安装证书存储中的情况下使用自签名证书

4
我有一个第三方的自签名证书(.cer)文件,希望在代码中使用该证书连接到他们的Web服务(通过HTTPS),而不必在Windows的证书存储中安装它。具体来说,这样其他团队成员就不需要在本地安装此证书才能进行连接工作。
是否可以在代码中实现这一点?它可以使用传统的webservice-client代码(使用wsdl.exe或VS的Add Web Reference)或WCF客户端代码(使用svcutil.exe或VS的Add Service Reference) - 我们还没有确定要采用哪种方式。
我已经尝试过:
proxy.ClientCertificates.Add(X509Certificate.CreateFromCertFile(@"d:\temp\mycert.cer"));

对于老式的webservice代码,没有运气 - 它仍然失败并显示无法建立SSL/TLS安全通道的信任关系。 直到我实际上将证书安装在证书存储中。同样适用于:

<identity>
  <certificate encodedValue="the base64 encoded contents of the file" />
</identity>

在app.config中使用WCF客户端技术的终结点。
谢谢。
2个回答

4
你需要证书的原因是HTTPS。网络服务是通过传输安全(HTTPS)保护的,使用的证书未被您的系统信任。要信任该证书,通常的方法是将证书安装到证书存储中。这一切都不是.NET的功能 - 它是.NET之外的Windows功能。
为了信任任意SSL证书,.NET提供了回调方法,您可以在其中编写自己的代码来验证证书:ServicePointManager.ServerCertificateValidationCallback。如果您只从回调中返回true,则会信任每个证书,但这仅用于开发和测试!一旦部署到生产应用程序中,应使用证书存储中的证书或使用在回调中定义的特定验证(不建议这样做)。

谢谢。最终我选择了在开发中接受所有证书的路线。幸运的是,在生产环境中,证书并非自签名,所以我们不会遇到这个问题。虽然我本来希望避免这种做法,即使只是在开发环境中,但感觉总有些不对劲,但我想我们只能接受现实。 - Joe Enos

1

.NET无法处理来自纯文本文件的证书+密钥组合(在这种情况下您需要它)。我还没有找到构建一个的方法;它根本不会读取证书的纯文本密钥。

然而,它可以使用P12/PFX容器,即使容器没有密码也可以工作。您甚至可以将其存储为编码字符串,并通过此构造函数重新构建它:http://msdn.microsoft.com/en-us/library/ms148418.aspx


我可能错了,但是由于 .cer 文件不包含私钥,我认为我将无法创建 PFX 容器。没有私钥的情况下还能完成这个任务吗? - Joe Enos
请注意 - 有时您会在单个文件中看到证书和私钥作为两个不同的部分。.NET无法处理它,但对于像OpenSSL这样的东西是有效的。但是如果没有私钥,您将无法将其用作客户端证书。 - Joe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接