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.CipherSuitesPolicy 或 SslClientAuthenticationOptions.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 Stream 和 Fedora 發行版本上,.NET 應用程式預設使用全系統加密原則允許的加密套件。 在這些發行版本中,請使用加密原則設定,不要變更 OpenSSL 設定檔。
受影響的 API
N/A