【问题标题】:Use self-signed cert without installing in cert store使用自签名证书而不在证书存储中安装
【发布时间】:2011-09-09 16:48:39
【问题描述】:

我有一个来自第三方的自签名证书 (.cer) 文件。我想在代码中使用该证书来连接到他们的网络服务(通过 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"));

使用老式 Web 服务代码,运气不好 - 在我实际在证书存储中安装证书之前,它仍然会因 Could not establish trust relationship for the SSL/TLS secure channel. 而失败。同样的事情:

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

在 app.config 的端点中使用 WCF 客户端技术。

谢谢

【问题讨论】:

    标签: .net web-services certificate wcf-client self-signed


    【解决方案1】:

    您需要证书的原因是 HTTPS。 Web 服务受传输安全 (HTTPS) 保护,证书不受系统信任。要信任证书,常用方法是将证书安装到证书存储区。这一切都不是 .NET 功能 - 它是 .NET 职责之外的 Windows 功能。

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

    【讨论】:

    • 谢谢。我最终走上了接受 dev 中所有证书的路线。幸运的是,在生产中,证书不是自签名的,所以我们不会遇到这个问题。我希望避免这条路线,即使只是开发也感觉不对,但我想我们必须忍受它。
    【解决方案2】:

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

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

    【讨论】:

    • 我可能弄错了,但由于 .cer 文件不包含私钥,我认为我无法创建 PFX 容器。没有私钥是否仍然可以完成此操作?
    • 检查——你有时会在一个文件中看到他们的证书和私钥,作为两个独立的部分。 .NEt 无法处理它,但它对 OpenSSL 之类的东西有效。但如果没有私钥,您将无法将其用作客户端证书。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 2012-04-18
    • 2023-04-02
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多