Share via


Linux 上 .NET 的預設 TLS 加密套件

Linux 上的 .NET 現在會透過 SslStream 類別或更高等級的作業 (例如透過 HttpClient 類別的 HTTPS),於執行 TLS/SSL 時遵守預設加密套件的 OpenSSL 設定。 預設加密套件未明確設定時,Linux 上的 .NET 會使用受允許加密套件的嚴格限制清單。

變更描述

在先前的 .NET 版本中,.NET 不會遵守預設加密套件的系統設定。 Linux 上的 .NET 預設加密套件非常寬鬆。

從 .NET 5 開始,只要於 openssl.cnf 中加以指定,Linux 上的 .NET 就會遵守預設加密套件的 OpenSSL 設定。 加密套件未明確設定時,幾個允許的加密套件如下所示:

  • TLS 1.3 加密套件
  • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

由於此後援預設值未納入任何與 TLS 1.0 或 TLS 1.1 相容的加密套件,系統會預設確實停用這些舊版通訊協定。

為特定工作階段將 CipherSuitePolicy 值提供給 SslStream 仍會取代設定檔內容和/或 .NET 後援預設值。

變更原因

在 Linux 上執行 .NET 的使用者要求將 SslStream 的預設設定變更為能從第三方評量工具提供高度安全性評等者。

導入的版本

5.0

新的預設值應能在與現代用戶端或伺服器通訊時生效。 如果您需要展開預設加密套件清單來接受舊版用戶端 (或聯絡舊版伺服器),請使用以下任意替代解決辦法:

  • 設定與 SslServerAuthenticationOptions.CipherSuitesPolicySslClientAuthenticationOptions.CipherSuitesPolicy 相關的 CipherSuitesPolicy 型別,藉此指定加密原則。

    var clientOpts = new SslClientAuthenticationOptions
    {
        // ...
        CipherSuitesPolicy = new CipherSuitesPolicy(
            new[]
            {
                TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
                TlsCipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
            }),
    };
    
    using (SslStream sslStream = new SslStream(networkStream))
    {
        sslStream.AuthenticateAsClient(clientOptions);
        // ...
    }
    

    或者,針對 HttpClient

    var handler = new SocketsHttpHandler
    {
        SslOptions =
        {
            CipherSuitesPolicy = new CipherSuitesPolicy(
                new[]
                {
                    TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
                    TlsCipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
                }),
        },
    };
    
    using (var httpClient = new HttpClient(handler))
    {
        // ...
    }
    
  • 變更 OpenSSL 設定檔。 在許多 Linux 發行版本上,OpenSSL 設定檔位於 /etc/ssl/openssl.cnf

    此範例 openssl.cnf 檔案為基本檔案,相當於 Linux 上 .NET 5 和更新版本的預設加密套件原則。 與其取代系統檔案,不如將這些概念合併至您系統上既有的檔案中。

    openssl_conf = default_conf
    
    [default_conf]
    ssl_conf = ssl_sect
    
    [ssl_sect]
    system_default = system_default_sect
    
    [system_default_sect]
    CipherString = ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256
    

在 Red Hat Enterprise Linux、CentOS 和 Fedora 發行版本上,.NET 應用程式預設使用全系統加密原則允許的加密套件。 在這些發行版本中,請使用加密原則設定,不要變更 OpenSSL 設定檔。

受影響的 API

N/A