.NET Core TLS 協議指定被我鑽了空子~~~

Jeffcky發表於2021-10-30

前言

此前,測試小夥伴通過工具掃描,平臺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呢?

至此,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上的部署、操作等等之類的,好了,我們下次再見!

相關文章