c# - 使用 SetCertificatePolicy() 为安全 Web 服务建立信任关系

标签 c# web-services ssl ssl-certificate

我用 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 服务。

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

TIA

最佳答案

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

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

至于您找到的代码片段,这是一个如何在 .Net 中作为客户端实现服务器证书验证的示例。但是,即使服务器证书有问题,示例本身也永远不会拒绝与服务器的连接,因此关于不在生产中使用代码的评论。在测试场景之外,您永远不想与由于证书错误而无法信任其身份的服务器进行通信。要提供“生产”实现,您必须检查“错误”参数的值以查看证书是否有任何问题,并且只有在没有问题时才返回 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 委托(delegate)返回 true,否则我返回 false,这会生成异常。为了使这个示例工作,我使用了 Fiddler代理请求并将不受信任的证书返回给我的客户端代码。如果您导航到 https://www.google.com在正常情况下,您应该不会看到任何证书错误,因为 Google 表现不错!!

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

关于c# - 使用 SetCertificatePolicy() 为安全 Web 服务建立信任关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8588815/

相关文章:

C#构造函数

c# - 如何设计一个包含网络服务结果的类

mysql - 在服务器上运行算法的应用程序

html - Facebook 页面选项卡触发 IE "Only secure content is displayed"消息

c# - Azure DevOps 2019 Server 无法执行具有代码覆盖率的测试

c# - 如何知道是否应用了 OrderBy 进行查询?

c# - 从隐藏的控制台应用程序显示表单

c# - 项目中不存在目标 "MSDeployTestConnection"

java - 找不到 PropertySource : PKIX path building failed for spring cloud config URL

java - https URL 主机名与客户端信任库中服务器证书上的公用名 (CN) 不匹配