TLS 1.2 - 警报级别 - 致命 - 描述协议版本

问题描述 投票:0回答:2

我正在尝试连接到在 TLS 版本 1.2 上使用双向身份验证的 Web 服务。 SSL 握手失败,当我在wireshark 上嗅探数据包时,出现以下握手错误。 (我的客户端通过发送“RST,ACK”来终止握手):

我还在 Windows 事件查看器上收到以下 SCHANNEL 错误日志:

生成致命警报并将其发送到远程端点。这可能 导致连接终止。 TLS协议定义 致命警报代码是 10。

目标名称:

可以在以下位置找到 TLS 警报注册表: http://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-6

这是什么意思?我能做什么呢?这是我的 C# 代码:

var cert = new X509Certificate2(PfxBytes);

using (var handler = new HttpClientHandler())
{
    handler.ClientCertificateOptions = ClientCertificateOption.Manual;
    handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true;
    handler.ClientCertificates.Add(cert);
    handler.SslProtocols = SslProtocols.Tls12;

    using (var client = new HttpClient(handler, false))
    {
    var postData = new StringContent("", UnicodeEncoding.UTF8, "application/json");
    var response = await client.PostAsync("<URL>", postData);

    string responseString = await response.Content.ReadAsStringAsync();
    Console.WriteLine(responseString);
    }
}

令人惊讶的是,这对于具有相同证书的邮递员来说效果很好。所以我很确定证书没有问题。无法弄清楚我的 C# 代码出了什么问题。

请帮忙。

c# tls1.2
2个回答
2
投票

我的理解是 TLS 协议版本不匹配。客户端似乎向服务器建议了不受支持的 TLS 版本。确保服务器和客户端可以使用相同版本的 TLS 协议。


0
投票

尝试使用 .NET Framework 4.8 WebRequest 或 HttpClient 连接时遇到相同的错误。

该请求适用于大多数机器,但对于某些机器,我收到“无法创建 SSL/TLS 安全通道”一般错误。

在 .NET 6.0 中运行该程序时,我收到了更详细的错误跟踪:“收到的消息意外或格式错误”,以及 Wireshark 中显示的“警报 (21) - Fatal 2 - 协议版本 (70)”。

对我来说,问题与 TLS 客户端接受的分段 TLS 握手消息的最大允许大小有关。

解决方案是在 Windows 注册表中添加此条目:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Messaging]
"MessageLimitClient"=dword:00418000

更多信息: 微软文档

© www.soinside.com 2019 - 2024. All rights reserved.