c# - ASP NET Core Web API 禁用 TLS 1.0 和 TLS 1.1 支持
问题描述
我正在尝试禁用对在 docker (Debian OS) 和 .NET 5 上运行的 API 的 TLS 1.0 和 TLS 1.1 支持。我发现此代码与此特定问题相关:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(opt =>
{
opt.ConfigureHttpsDefaults(s =>
{
s.SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls13;
});
}).UseStartup<Startup>();
}
);
但是,在发布更改时,我正在运行一个脚本来确定服务器是否仍然支持 TLS1.0 和 TLS1.1,令人惊讶的是,尽管我明确地将 HTTPS 默认设置为 TLS1.2 和 TLS1.3,但我得到了以下结果:
这是 Powershell 脚本:
$HostName = 'YOUR_URL'
$Port = '443'
$RetValue = New-Object psobject -Property @{
Host = $HostName
Port = $Port
SSLv2 = $false
SSLv3 = $false
TLSv1_0 = $false
TLSv1_1 = $false
TLSv1_2 = $false
TLSv1_3 = $false
KeyExhange = $null
HashAlgorithm = $null
}
"ssl2", "ssl3", "tls", "tls11", "tls12","tls13" | %{
$TcpClient = New-Object Net.Sockets.TcpClient
$TcpClient.Connect($RetValue.Host, $RetValue.Port)
$SslStream = New-Object Net.Security.SslStream $TcpClient.GetStream(),
$true,
([System.Net.Security.RemoteCertificateValidationCallback]{ $true })
$SslStream.ReadTimeout = 15000
$SslStream.WriteTimeout = 15000
try {
$SslStream.AuthenticateAsClient($RetValue.Host,$null,$_,$false)
$RetValue.KeyExhange = $SslStream.KeyExchangeAlgorithm
$RetValue.HashAlgorithm = $SslStream.HashAlgorithm
$status = $true
} catch {
$status = $false
}
switch ($_) {
"ssl2" {$RetValue.SSLv2 = $status}
"ssl3" {$RetValue.SSLv3 = $status}
"tls" {$RetValue.TLSv1_0 = $status}
"tls11" {$RetValue.TLSv1_1 = $status}
"tls12" {$RetValue.TLSv1_2 = $status}
"tls13" {$RetValue.TLSv1_3 = $status}
}
# dispose objects to prevent memory leaks
$TcpClient.Dispose()
$SslStream.Dispose()
}
$RetValue
这是 Kestrel 配置上的错误吗?我可以做其他事情来禁用 TLS1.0 和 TLS1.1 加密吗?
编辑这是我试图解决的原始问题:
远程服务接受使用 TLS 1.0 加密的连接。TLS 1.0 有许多加密设计缺陷。较新版本的 TLS 是针对这些缺陷而设计的,应尽可能使用。PCI DSS v3.1 要求在 2018 年 6 月之前完全禁用 TLS 1.0,销售点终端及其终止点除外。自 2020 年 3 月 31 日起,未启用 TLS 1.2 及更高版本的端点将不再与主要 Web 浏览器和主要供应商一起正常运行。
解决方案
自 .net 5 起,禁用 TLS 版本的选项似乎已被删除,而是必须在操作系统中禁用。
Kestrel 现在使用系统默认的 TLS 协议版本,而不是像以前那样限制与 TLS 1.1 和 TLS 1.2 协议的连接。
那么问题可能变成:如何在使用 Debian 的 docker 映像中禁用它,似乎可以通过 dockerfile 中的 docker RUN OpenSSL 命令来完成,在 OpenSSL 或 OpenSSL 的配置文件中禁用它。
如何在 OpenSSL 中禁用 TLS v1.0 和 TLS v1.1
在 oid_section 之后的 /etc/ssl/openssl.cnf 中添加:
openssl_conf = default_conf
[default_conf]
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT@SECLEVEL=2
https://blog.surgut.co.uk/2019/08/how-to-disable-tls-10-and-tls-11-on.html
推荐阅读
- swift - 按字符串 NSPredicate 过滤核心数据
- python - 如何在字典 Python 中将每个学生的成绩附加到列表中
- flutter - 使 Column force Container 与其他小部件 Flutter 大小相同
- recaptcha - 在 sapper 中使用 recaptcha
- node.js - 当我在我的反应应用程序中使用我的 Heroku 配置变量时,它们以未定义的形式返回
- google-cloud-platform - 谷歌云数据流:CloudBigtableScanConfiguration.withScan(),如何传递动态过滤值?
- sql-server - PowerShell v5.1 - 加载 SqlServer 模块不会加载 Read-SqlTableData 或 Write-SqlTableData,而是加载所有其他命令
- python - 正则表达式:将遇到的字符串与斜杠组合在一起,如果 n 长度则为连字符
- apache - Shibboleth 属性未映射
- node.js - 如何从私有 Azure Blob 存储容器中删除 Blob