2011-06-06 101 views
2

我有第三方的自签名证书(.cer)文件。我想在代码中使用该证书来连接到他们的Web服务(通过HTTPS),而无需在Windows中的我的证书存储中安装它。特别是,这样团队中的所有其他开发人员不必在本地安装此证书,以便连接为他们工作。使用自签名证书而不安装在cert store中

有没有办法在代码中做到这一点?它可以使用老式的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中的端点。

感谢

回答

3

您需要证书的原因是HTTPS。 Web服务通过传输安全(HTTPS)进行保护,并且证书不受系统信任。为了信任证书,常见的方法是将证书安装到认证存储。这一切都不是.NET功能 - 它是.NET功能之外的Windows功能。

要信任任意SSL证书.NET提供回调方法,您可以使用自己的代码来验证证书:ServicePointManager.ServerCertificateValidationCallback。如果您只从回调中返回true,则您将信任每个证书,但仅用于开发和测试!一旦部署到生产应用程序,应使用来自认证存储的证书或使用回调中定义的特定验证(不推荐)。

+0

谢谢。我最终开始接受dev中所有证书的路线。幸运的是,在生产中,证书不是自签名的,所以我们不会有这个问题。我希望避免这条路线,即使它只是开发,也只是感觉错误,但我想我们必须忍受它。 – 2011-06-10 22:41:27

1

.NET不能/不会处理从一个纯文本文件中的证书+组合键(你在这种情况下需要)。我还没有找到一种方法来构建一个;它平坦不会读取证书的明文密钥。

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

+0

我可能会错,但由于.cer文件不包含私钥,我不认为我能创建一个PFX容器。没有私钥还可以完成吗? – 2011-06-07 00:42:55

+0

检查 - 您有时会在单个文件中将他们的证书和私钥看作两个不连续的部分。 .NEt无法处理它,但它对于像OpenSSL这样的东西是有效的。但是,如果没有私钥,则不能将其用作客户端证书。 – Joe 2011-06-07 01:00:59