【问题标题】:Bypassing SSL Certificate Validation on DotNet Core Service Stack绕过 DotNet 核心服务堆栈上的 SSL 证书验证
【发布时间】:2017-06-06 20:25:52
【问题描述】:

我知道ServicePointManager.ServerCertificateValidationCallback 不再存在于 .Net Core 中,而是替换为:

using(var handler = new System.Net.Http.HttpClientHandler())
{
    using (var httpClient = new System.Net.Http.HttpClient(handler))
    {
        handler.ServerCertificateCustomValidationCallback = (request, cert, chain, errors) =>
        {
            return true;
        };

    }
}

然而,我们目前正在使用 ServiceStack.Core 库,据我所知,它既不公开这样的属性,也不公开处理程序本身。

如何告诉 ServiceStack 客户端绕过这段代码中的 ssl 验证?

using(var client = new JsonServiceClient("https://www.google.com"))
{
    var response = client.Get("/results");
}

如果有办法,这在 Windows 和 Linux 上是否同样有效?

【问题讨论】:

  • “绕过 SSL 证书验证...” - 听起来很糟糕。它将您的应用程序移动到The most dangerous code in the world: validating SSL certificates in non-browser software 的领域。也许您应该将其改写为“如何执行自定义验证...”,然后执行对您的应用有意义的检查。
  • @jww “世界上最危险的代码”对我来说听起来非常夸张,尤其是在没有上下文的情况下。如果您正在编写一个使用自签名证书访问内部服务的工具怎么办?
  • 如果您有自签名证书,则可以对其进行验证。没有必要放弃或避免验证。您甚至可以跳过证书验证并跳入公钥固定。在固定的情况下,证书只是一个演示细节,您所需要的只是主机的公钥来识别它。我在想你可能问错了问题,但我知道的不够肯定。也许您应该退后一步,问一些问题,例如如何在您的服务中使用自签名证书。

标签: c# linux servicestack .net-core


【解决方案1】:

JsonServiceClient 是基于 .NET HttpWebRequest 构建的,它已在 .NET Core 中重写为 wrapper over HttpClient,因此我们通常建议使用 .NET Core 来避免这种开销(这比 .NET 4.5 慢得多) 并改用JsonHttpClient in ServiceStack.HttpClient,因为它直接使用HttpClient,您可以在其中注入自己的HttpClientHandler

var client = new JsonHttpClient(baseUrl)
{
    HttpMessageHandler = new HttpClientHandler
    {
        UseCookies = true,
        AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate,
        ServerCertificateCustomValidationCallback = (req,cert,chain,errors) => true
    }
};

请注意,建议使用reuse HttpClient instances,因此您应该尽可能重用 HttpClient 实例并避免丢弃它们。

【讨论】:

    猜你喜欢
    • 2016-11-03
    • 2021-02-08
    • 2017-08-29
    • 2014-07-07
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多