.NET Core TLS 协议指定被我钻了空子~~~

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.NET Core TLS 协议指定被我钻了空子~~~相关的知识,希望对你有一定的参考价值。

【导读】此前,测试小伙伴通过工具扫描,平台TLS SSL协议支持TLS v1.1,这不安全,TLS SSL协议至少是v1.2以上才行,想到我们早已将其协议仅支持v1.3,那应该非我们平台问题。

近日,第三方合作伙伴再次提到该高危安全问题,我依然自信的解释,与我们平台无关,应与openssl自身配置支持v1.1有关,但此问题必须得到解决,抱着半信半疑的态度,难道是代码问题?于是乎,开始探索之路,本文以ASP.NET Core 3.1.20作为示例

验证TLS SSL协议问题

由于平台相关配置启用太多,以排除带来的影响,我单独写了一个干净的web api,代码如下。

webBuilder.UseStartup<Startup>();
webBuilder.UseKestrel(options => 
{
    var sslCertPath = Path.Combine(AppContext.BaseDirectory, "ssl.pfx");

    options.Listen(IPAddress.Any, 5000,
        listenOption =>
        {
            listenOption.UseHttps(sslCertPath, "KSnRJkGPf@OVA8uDsY*D5EP4kd!AagLS84uNS~5@@u#dKrNxHC");
        });

    options.ConfigureHttpsDefaults(co =>
    {
      co.SslProtocols = SslProtocols.Tls13;
    });

});

然后我们将其发布到linux上并运行起来,如下:

接下来我们借助nmap工具扫描该端口,如下:

耐心等待一会,最终扫描输出结果如下,我惊呆了

.NET Core TLS SSL协议默认启用的是支持v1.1和v1.2,明明设置的是仅支持v1.3,这不是和没设置一样吗?

webBuilder.UseStartup<Startup>();
webBuilder.UseKestrel(options => 
{
    var sslCertPath = Path.Combine(AppContext.BaseDirectory, "ssl.pfx");

    options.ConfigureHttpsDefaults(co =>
    {
        co.SslProtocols = SslProtocols.Tls12;
    });

    options.Listen(IPAddress.Any, 5000,
        listenOption =>
        {
            listenOption.UseHttps(sslCertPath, "KSnRJkGPf@OVA8uDsY*D5EP4kd!AagLS84uNS~5@@u#dKrNxHC");
        });

});

那只能说明代码有问题,既然已经设置了,但是未生效,so,那说明放的顺序有问题,那我将上述设置协议放在监听HTTPS之前又会如何呢?如上,首先我们配置仅支持v1.2,会不会扫描出v1.1呢?

看来猜测的不错,和配置顺序有关系,v1.1协议已不支持,同理,对于配置v1.3输出结果如下

至此,TLS SSL协议指定已经得到了解决,稍加思索,想想也正常,监听端口之前,必须建立连接,所以协议配置肯定在监听端口之前指定

讲到这里,我们进一步稍加了解原理,对于协议和端口监听整个过程大概是怎样的

我们首先看看通过指定SSL证书路径和密码监听HTTPS内置的大致实现

监听HTTPS存在多个重载,看来都是通过X509Certificate2来加载证书、验证证书等等操作

内置赋值上述类加载证书,然后在如下扩展方法中应用各个选项,如下标注即为引用进行连接的选项

由于我们在开始时将SSL v1.3协议配置在监听HTTPS下面,所以执行到这里时,使用的默认协议1.1和1.2

同时需要注意一点的是:在.NET Core 3.x版本中,证书密码必须提供,但此种情况我通过查看源码,若没记错的话,应该是5.x中,证书密码可以为空

‍‍‍‍‍‍‍‍‍其实在监听HTTPS扩展方法中提供了所使用连接TLS SSL协议的重载,当时配置时没想那么多,因为此前配置已经写好,平台根据实际情况可开启HTTP或HTTPS,所以直接调用默认HTTPS选项配置,结果大意了‍‍‍‍‍‍‍‍‍

当然若明确必须是HTTPS协议,我们也可以基于默认配置去修改,如下:

webBuilder.UseStartup<Startup>();
webBuilder.UseKestrel(options =>
{
    var sslCertPath = Path.Combine(AppContext.BaseDirectory, "ssl.pfx");

    options.ConfigureHttpsDefaults(co =>
    {
        co.SslProtocols = SslProtocols.Tls13;
        co.ServerCertificate = new X509Certificate2(sslCertPath, "KSnRJkGPf@OVA8uDsY*D5EP4kd!AagLS84uNS~5@@u#dKrNxHC");
    });

    options.Listen(IPAddress.Any, 5000);

});

没啥可总结的,大意失荆州,一度怀疑配置了v1.3,但工具扫描却支持1.1和1.2,认为问题出在openssl配置支持的问题,未曾想一时疏忽,一顿操作,没考虑建立连接过程,则对应配置顺序也应一致,.NET Core提供多种配置,然鹅我却刚好卡在中间,自己钻了自己的空子

‍‍‍‍后面多学习,开始多写写.NET Core在Linux上的部署、操作等等之类的,好了,我们下次再见‍‍‍‍

以上是关于.NET Core TLS 协议指定被我钻了空子~~~的主要内容,如果未能解决你的问题,请参考以下文章

coredns源码分析

使用 .NET 6 在 ASP.NET Core 中处理 API 调用中的空子类

Java防止SQL注入

.Net Core gRPC 实战

asp.net core 2.0 中的 WCF - 无法为具有权限的 SSL/TLS 安全通道建立信任关系

.Net Framework 4.6.1 不默认为 TLS 1.2