.NET 通过 TLS 1.2 删除客户端证书

2024-04-18

您好,似乎这个问题的某种形式已经被问过一百万种不同的方式,但许多人没有答案,或者答案不适用于我。

我们有一个微不足道的小型 .NET 服务,可以调用目前仅支持 TLS 1.2 的第 3 方 API。

        var requestHandler = new WebRequestHandler();
        var clientCert = GetClientCert("THUMBPRINT");

        requestHandler.ClientCertificates.Add(clientCert);
        var encodedHeader = "FOO";
        var httpClient = new HttpClient(requestHandler) { BaseAddress = new Uri("https://foo.bar.com/rest/api/") };
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", encodedHeader);

        var httpResponse = httpClient.GetAsync("").Result;
        var responseContent = httpResponse.Content.ReadAsStringAsync().Result;

当我将安全协议明确设置为 1.2 或以默认为 1.2 的框架为目标时,客户端证书不是发送到服务器的数据包的一部分。我在 Wireshark 中检查过它,证书在 1.2 版本中从未出现过。此时,服务器发送致命警报握手失败 (40),这会导致以下 .Net 异常:

The request was aborted: Could not create SSL/TLS secure channel.

我可以通过 Chrome 或 Postman(本机)进行相同的调用,并且效果很好。如果我将协议设置为 1.1,它就可以正常工作。但如果我通过 .NET 将其作为 1.2 运行,它每次都会失败。即使我故意根本不添加客户端证书,我也会在 Wireshark 中得到相同的错误和相同的流量。

我通过运行第 3 方端点https://www.ssllabs.com/ https://www.ssllabs.com/而且成绩很好。我在两边都看不到任何 MD5 签名。所有内容均通过 RSA 加密的 sha1 或 sha256 进行签名。

我启用了跟踪。以下输出似乎表明查找证书或其私钥没有问题:

System.Net Information: 0 : [19512] SecureChannel#41622463 - Certificate is of type X509Certificate2 and contains the private key.
System.Net Information: 0 : [19512] SecureChannel#41622463::.AcquireClientCredentials, new SecureCredential() (flags=(ValidateManual, NoDefaultCred, SendAuxRecord, UseStrongCrypto), m_ProtocolFlags=(Zero), m_EncryptionPolicy=RequireEncryption)
System.Net Information: 0 : [19512] AcquireCredentialsHandle(package = Microsoft Unified Security Protocol Provider, intent  = Outbound, scc     = System.Net.SecureCredential)
System.Net Information: 0 : [19512] InitializeSecurityContext(credential = 
System.Net.SafeFreeCredential_SECURITY, context = 1ed7465db80:1f1d854c910, targetName = foo.bar.com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [19512] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=133, returned code=ContinueNeeded).

我还打开了 SCHANNEL 事件记录。在那里我可以看到它使用私钥获取客户端证书。

The TLS client credential's private key has the following properties:

   CSP name: Microsoft Enhanced Cryptographic Provider v1.0
   CSP type: 1
   Key name: {some hex here}
   Key Type: key exchange
   Key Flags: 0x0

 The attached data contains the certificate.

接下来是Wireshark中Alert包对应的错误:

A fatal alert was received from the remote endpoint. The TLS protocol defined fatal alert code is 40.

我完全没有主意了。感觉就像.Net 中的一个错误。我们一度认为这是一个与我们的客户端证书不完整的信任链,因为我们的证书包只有客户端证书和一个中间 CA。但我们从供应商处获得了根 CA,现在 Windows 表示该证书是合法的。

我在 Wireshark 中注意到的一件有趣的事情是,我们在成功调用时发送客户端证书和中间 CA。我不知道它是如何获取中间 CA 的,因为我只提取客户端证书来附加到请求。一旦我们有了根 CA,为什么它不也提交它呢?我的直觉告诉我问题可能仍然存在于某个地方,但我无法证明这一点。任何日志中都没有任何内容表明信任链发生故障。

我什至还连接了 ProcMon,看看是否能发现任何问题,但什么也没有跳出来。伙计,我花在这上面的时间本可以用 Java 重写整个事情。

我尝试过的其他一些方法不起作用:

针对 .Net 4.8

机器存储与用户存储

直接从 pfx 加载

HttpWebRequest 而不是 HttpClient

TcpClient 与 SslStream

较新的 Windows 10 版本

EDIT我刚刚读到一些内容,说 SHA-1 签名也与 MD5 一起从 TLS 1.2 中删除。我们的客户证书是用 SHA-1 签名的。我想可能就是这样,我们正在联系我们的供应商。


我的问题和我的解决方案最终与此相同。唯一的区别是我的客户端证书是 SHA1 而不是 MD5。 .NET 显然也放弃了 SHA1 证书。

C# 和 dotnet 4.7.1 未为 TLS 1.2 调用添加自定义证书 https://stackoverflow.com/questions/47904777/c-sharp-and-dotnet-4-7-1-not-adding-custom-certificate-for-tls-1-2-calls

这篇文章给了我线索,因为其他帖子表明 SHA1 仍然被接受。我的 SHA1 证书在 .NET 之外仍然有效。

https://tools.ietf.org/id/draft-ietf-tls-md5-sha1-deprecate-00.html https://tools.ietf.org/id/draft-ietf-tls-md5-sha1-deprecate-00.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET 通过 TLS 1.2 删除客户端证书 的相关文章

  • 以编程方式调用 EntityDeploy 构建任务

    我正在使用 Roslyn 来编译 发出和运行 C 源代码 但是 在面对使用 EntityFramework 的项目时 我遇到了限制 似乎简单地发出编译是不够的 因为有一个EntityDeploy在 DLL 发出后对其进行操作的构建任务 我相
  • 是否可以将 ServiceStack.Text.JsConfig 设置范围限制为您的库?

    我正在编写一个使用的自定义库ServiceStack Text https github com ServiceStack ServiceStack Text内部 使用我的其他库也可能使用 ServiceStack Text 我想改变一些J
  • 无法验证 SSL 证书

    我想做的事 与以下人员保持干净的联系openssl connect到远程站点 网站似乎是自签名的 What I m getting CONNECTED 00000003 depth 0 CN DC01 home pri verify err
  • WCF WebGetAttribute 与 WebInvokeAttribute

    WebGetAttribute 只是 Method GET 的 WebInvokeAttribute 的语法糖吗 或者有根本的区别吗 您立即观察到 WebGet 和 WebInvoke 非常相似 这与事实相差不远 正如您已经说过的 WebG
  • .NET 中的 vista/win7 放大 API

    Win7 Vista SDK中有magnification lib可供使用放大API http msdn microsoft com en us library ms692162 28VS 85 29 aspx对于C 如何在 NET win
  • 使用BindingSource很慢?

    我有一个 C Windows 窗体项目 其中的窗体包含 2 个列表框和一个按钮 在 FormLoad 上 左侧列表框填充了一个列表 约 1800 个项目 其中包含有关证券的信息 ID 和名称 当用户单击按钮时 所有证券都会从左侧列表框移至右
  • (Console.BufferHeight) 我无法使用 Console.WriteLine 查看/滚动查看所有控制台输出

    当我运行此代码时 输 出窗口顶部的数字是 99701 为什么我看不到一直到 1 的数字 我实际上看到所有数字都被输出 但在控制台窗口上 我只能滚动到足够高才能看到 99701 我猜 我在 Vista Home 上使用 Visual C Ex
  • 忽略 Xamarin.Forms (PCL) 中的 SSL 证书错误

    有没有办法做类似这里描述的事情 https stackoverflow com a 2675183 https stackoverflow com a 2675183但在 Xamarin Forms PCL 应用程序中 我正在使用 Http
  • 检测活动 RDP 会话

    我需要在我的应用程序中实现死人开关 如果应用程序从 RDP 运行 我需要在它失去与远程客户端的连接时采取行动 我知道当我在 RDP 中运行时使用 GetSystemMetrics SystemMetric SM REMOTESESSION
  • 限制文本框中每行的最大字符数

    假设我有以下内容
  • 使用 MVC 通配符证书在 Azure 上托管许多 SSL 站点

    以下应用程序当前在我尝试迁移到 Azure 的 Windows 2008 R2 服务器上运行 Part 1 首先 我有以下 ASP NET MVC 站点 它根据 DNS 名称的第一部分路由客户 https customer1 myAzure
  • 创建无模式消息框

    如何创建一个无模式消息框 我是否必须创建自己的 Windows 窗体类并使用它 如果是这样 是否有一种简单的方法来添加警告图标 而不是插入我自己的图像 并根据文本量调整大小 如果您需要一个在代码继续在后台运行时自动显示的消息框 该框仍然是模
  • 如何动态调用动态对象的方法?

    当我想在 C 中的任何对象上动态调用静态定义的 静态 是指 在编译时确定 的意义上 而不是 类级成员 的意义上 方法时 我可以使用反射获取该方法的句柄并调用它 typeof Foo GetMethod Bar Invoke foo new
  • .NET 中的 base_convert

    NET 是否具有与 PHP 等效的本机功能基数转换 http php net base convert或者我需要自己写 我想从任何基数转换为任何其他基数 其中 to 基数或 from 基数可以是 2 36 的任何整数 PHP 函数示例 ba
  • 每个 System.ComponentModel.DataAnnotations 属性的用途是什么?

    我正在使用带有 POCO 的实体框架 4 制作 MVC 3 应用程序 我想尽可能多地注释我的所有实体 然而 我遇到一个问题 我无法找到有关每个属性含义的良好文档 有些非常简单 比如 Required or StringLength 具有像这
  • 如何仅使用物理 wsdl 文件生成服务引用

    我多年来一直在创建和使用 Web 服务 并且始终能够使用 Visual Studio 从客户端创建服务引用 我需要使用第三方服务 但他们拒绝打开其安全性 以便我可以查看 wsdl 并进行服务引用 这是一项面向公众的服务 因此我认为不需要这种
  • 使用 .NET 类进行 OpenSSL 加密

    我希望创建一个使用与 OpenSSL 兼容的 NET 库的类 我知道有一个 OpenSSL Net 包装器 但我希望避免引用第 3 方 非托管代码 我并不是要讨论这是否是正确的选择 但这是有原因的 目前我有以下内容 我认为它应该与 Open
  • 如何在 .net 中为 Google 云存储签名 url

    我想知道如何使用 net中的谷歌云存储类生成signurl 我已经根据要求创建了字符串 GET 1388534400 bucket objectname 但我现在想用 p12 密钥签署这个 url 然后想让它变得 url 友好 该库没有显示
  • Random 并行生成数字 1 的次数超过 90% [重复]

    这个问题在这里已经有答案了 考虑以下程序 public class Program private static Random rnd new Random private static readonly int ITERATIONS 50
  • 在 10 亿次迭代中获得相同 GUID 的机会有多大?

    我正在开展一个项目 需要生成大约 10 亿个 GUID 我知道 GUID 不能保证是唯一的 但几乎始终是唯一的 如果我生成了十亿个 GUID 那么匹配的概率是多少 博客文章 GUID 是全局唯一的 但 GUID 的子字符串不是 https

随机推荐

  • 是否可以使用 content:// 作为 WebView 中

    我创建了一个ContentProvider 它导出我的 asset 目录中的文件 我使用 content url 来访问 WebView 中导出的内容 以下 HTML 按预期工作 img src 我正在尝试使用 mp3 音频文件的内容提供程
  • php 将变量绑定到旧 PHP 中的函数作用域

    我想将变量绑定到函数的作用域 我可以在 PHP 5 3 之后使用 use 关键字在 php 中执行此操作 但是如何在 PHP 5 3 以下的版本中执行等效操作 test use keyword function test use keywo
  • RDBMS 对 Golang 的影响 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我不会对这个关于我测试过的内容和数字运算的问题进行长篇大论 我对最新的实际练习表演更感兴趣 我已经阅读了大量的文章 其中一些非常怀疑 或者非常怀
  • Visual Studio 默认自动完成使用系统类型名称

    奇怪的问题 但我的老板有点老派 坚持在我们的编码标准中我们不使用 C 简写系统类型 他喜欢我们使用完整的系统名称 他喜欢事情变得冗长 我很乐意遵守这个标准 然而 几个月后开始让我恼火的是 Visual Studio 在完成代码时不喜欢遵守标
  • Android 如何从相机捕获两个连续的帧

    我正在尝试在 Android 设备上对光流进行编程 我的问题是从相机获取两个连续的帧 这是获取一帧的代码 mCamera setPreviewCallback new PreviewCallback public void onPrevie
  • Java 装饰器模式:我可以装饰受保护的方法吗?

    我想要Decorate 装饰器设计模式 一个通用的基类 但是我需要的方法Decorate受到保护 参见示例 public class AbstractActor public void act Delegates its actions t
  • 强制隐式调用的依赖类型解析

    我有一个包装特征 trait Wrapper T type Own F lt OwnThing F def ask F implicit own Own F 还有不同的实现 这里是一个例子 class CombinedWrapper A B
  • 暗淡和公共有什么区别?

    今天提出了一个关于范围的问题 这引起了我的思考 我一直了解 VBScript 范围以及如何声明全局和本地 我突然想到我从来没有使用过Public变量但倾向于使用Dim相反 在全局声明时 据我了解Dim是相同的Public 但如果是这样的话
  • PHP 密码的正则表达式 [重复]

    这个问题在这里已经有答案了 我在网上找到了一个脚本 它有一个 JavaScript 中的密码正则表达式 我仍然想使用它 但为了更安全 我也想使用 PHP 来验证我的密码 但我对正则表达式毫无用处 要求 必须至少 8 个字符 必须包含至少 1
  • 使用 sass 3 自定义 Bootstrap 5 颜色时出现无效 CSS 值错误

    我想用 SASS 更改 bootstrap 默认主题颜色 问题是当我更改颜色并编译时 它会给我无效的 CSS 值错误 我已阅读文档并在 YouTube 上看到了一些教程 但我看不出问题出在哪里 我正在使用 bootstrap 5 1 0 s
  • 此应用程序是否使用广告标识符 (IDFA)? - AdMob 6.8.0

    我目前正在将我的应用程序上传到 App Store Apple 询问我此应用程序是否使用 IDFA 我正在使用最新的 Admob SDK 或 6 8 0 但我不知道它是否使用 IDFA 如果使用 我应该点击哪些复选框 Image http
  • 调用重写的虚函数而不是重载

    假设我有这部分代码 include
  • 从 python 3 脚本构建适用于 Windows 的 .exe

    我想为 python 3 脚本构建一个可执行文件 导入 pyqtgraph 使用 pyqt5 导入 theano 和 pymc3 还导入 numpy scipy sys os 打开一个用 qt 设计器制作并存储在 ui 文件中的简单 GUI
  • 使用 Kotlin 创建新目录,Mkdir() 不起作用

    var filename blesson txt var wallpaperDirectory File sdcard Wallpaper wallpaperDirectory mkdirs val outputFile File wall
  • 在 D3.js 中绘制多条线

    到目前为止 我一直在使用循环将线条元素添加到 D3 可视化中 但这似乎不符合 API 的精神 假设我有一些数据 var data time 1 value 2 value2 5 value3 3 value4 2 time 2 value
  • 如何从仅包含键和键值对列表的列表创建字典(Python)?

    这是这个问题的延伸 如何在 Python 中拆分列表中的字符串以创建键值对 https stackoverflow com questions 12739911 how to separate string and create a key
  • 如何在 ASP.NET MVC Web 应用程序中使用 Ninject?

    我创建了一个新的 MVC Web 应用程序 并且引用了 Ninject dll Ninject Web Common dll 和 Ninject Web MVC dll Global asax cs public class MvcAppl
  • Application.Ontime 取消无法调用对象“Application”的“ONTIME”方法

    I am 完全地失去了所以任何帮助将不胜感激 我试图取消打开工作簿时触发的 2 个计划事件 并使用 Application Ontime 方法重复 我知道要终止 OnTime 计划循环 您必须提供计划运行的确切时间 并且拥有多个 Appli
  • 在 doxygen 中使用 SVG

    我正在尝试将 SVG 添加到我的 doxygen 文档中 第一次尝试是使用 image blabla svg 这有点工作 但是 SVG 包含另一个 png 参考 并且 内部 png 未显示 这在 Chrome 上有效 但即使在 Firefo
  • .NET 通过 TLS 1.2 删除客户端证书

    您好 似乎这个问题的某种形式已经被问过一百万种不同的方式 但许多人没有答案 或者答案不适用于我 我们有一个微不足道的小型 NET 服务 可以调用目前仅支持 TLS 1 2 的第 3 方 API var requestHandler new