【问题标题】:Establish trust relationship for secure web service using SetCertificatePolicy()使用 SetCertificatePolicy() 为安全 Web 服务建立信任关系
【发布时间】:2012-01-25 04:56:04
【问题描述】:

我用 C# 编写了一个 .NET 应用程序,它与一些 Web 服务联系。当我在非安全 URL 上引用 Web 服务时,一切正常;但是当我在安全的 HTTPS URL 上引用相同的 Web 服务时,我收到一条异常消息“无法为 SSL/TLS 安全通道建立信任关系”。

我被指向此网页http://www.codemeit.com/wcf/wcf-could-not-establish-trust-relationship-for-the-ssltls-secure-channel-with-authority.html。并将代码添加到我的应用程序中。这解决了问题,我现在可以按预期使用安全 Web 服务。

我注意到上面的代码 sn-p 说“不打算在生产环境中使用”,它目前信任任何证书。为了使其在生产环境中更安全,我是否应该检查它以获得我们自己的证书?我应该如何检查这个,RemoteCertificateValidate() 方法中的 'cert' 参数中有很多信息,所以我不确定我应该如何检查或检查什么。

TIA

【问题讨论】:

    标签: c# web-services ssl ssl-certificate


    【解决方案1】:

    当您的客户端建立安全 SSL 连接时,服务器用来标识自身的证书很可能存在问题。以我的经验,这主要是由于服务器返回的证书未由受信任的根授权机构签名,或者链中的一个或多个证书无效(例如,它们已过期或用于您所在的域之外的域)连接到)。

    为了帮助识别问题,您可以尝试浏览到服务端点 URL 并查看浏览器是否报告了任何问题。如果服务器证书无效,现代浏览器会警告您,并且有时会告诉您原因。如果您使用的是 Chrome 并且证书存在问题,您将在地址栏(或多功能框)左端的挂锁图标上看到一个红色叉号。如果你点击挂锁,Chrome 会告诉你为什么它不喜欢这个证书。

    至于你找到的代码sn-p,这是一个如何在.Net中作为客户端实现服务器证书验证的示例。但是,即使服务器证书有问题,示例本身也永远不会拒绝与服务器的连接,因此有关不在生产中使用代码的评论。在测试场景之外,您永远不想与由于证书错误而无法信任身份的服务器进行通信。要提供“生产”实现,您必须检查“error”参数的值,以查看证书是否有任何问题,如果没有,则仅返回 true。

    using System;
    using System.Net;
    using System.Net.Security;
    using System.Security.Cryptography.X509Certificates;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Attach my certificate validation delegate.
                ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate;
    
                System.Net.HttpWebRequest request = WebRequest.CreateHttp("https://www.google.com");
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            }
    
            private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error)
            {
                if (error == SslPolicyErrors.None)
                {
                    return true;
                }
    
                return false;
            }
        }
    }
    

    在此示例中,如果错误的值等于 SslPolicyErrors.None,我只会从我的 ServerCertificateValidationCallback 委托返回 true,否则我会返回 false,这会生成异常。为了使这个示例正常工作,我使用Fiddler 代理请求并将不受信任的证书返回给我的客户端代码。如果您在正常情况下导航到 https://www.google.com,您应该不会看到任何证书错误,因为 Google 运行良好!!

    带有证书的 PKI 可能是一个难以处理的域。就文档 Wikipedia has a good article on PKI 而言,它涵盖了如何使用受信任的机构签署 SSL 中使用的证书,以便客户端可以信任他们正在与之通信的服务器的身份。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 2014-07-17
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多