.NET 7.0/8.0 MacOS 12.7.2 拒绝在 TLS1.2 握手中包含 CA 证书

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

在 MacOS 中与相互证书身份验证端点通信总是会导致握手失败,完全相同的代码在 Windows 中工作正常。 MacOS 中的浏览器运行良好。

我尝试了多种方式加载 X509Certificate 类,包括直接从包含 CA 证书和私钥的文件中读取。 Mac 钥匙串在登录和系统钥匙串中具有 CA/中间证书和根证书,它们是受信任的,但是当我查看 Wireshark 中的数据包时,MacOS 错误数据包仅包含实体证书...也不包含 CA,其中Windows(和 macOS Firefox)中的 Wireshark 正确显示两个证书:实体和 CA。

在具有 2 个证书的 Windows 和 macOS Firefox 中成功调用:

在 MacOS 中使用 1 个证书调用失败:

不确定握手消息的差异是否有意义,成功的 Windows 握手(和 Mac 浏览器)是证书、客户端密钥交换、证书验证和更改密码规范(后跟仅包含加密握手消息的数据包),而失败的 MacOS 数据包仅具有证书和客户端密钥交换,后续数据包具有证书验证、更改密码规范和加密握手消息。

MacOS 控制台在握手失败时显示以下内容,考虑到 CA 证书未包含在 SSL 调用中,这并不奇怪:

X509Chain.Build 返回 valid=true,但仅包含 ChainElements 集合中的一个元素。我本来希望看到 CA 和/或根。我需要使用 X509ReplicationMode.NoCheck ,否则我会收到“发生不完整的证书吊销检查。”。与 X509RecationFlag.EntireChain、X509ReitationFlag.EndCertificateOnly 和 X509ReitationFlag.ExcludeRoot 的结果相同。

尝试取消对中间证书的信任,但没有区别。 当我第一次添加根证书时,它说“不可信”......所以我必须在钥匙串中手动将其设置为可信。不确定这是否重要。

如何在 MacOS dotnet 中成功调用?

c# .net-core certificate x509certificate2 ssl-handshake
1个回答
0
投票

@bartonjs 来救我了。根据他的评论“c)也许您信任中间证书,这让 macOS 只返回部分链”,我通过将 Keychain 中的实体证书更改为“使用系统默认值”而不是“始终信任”来解决此问题'。将其设置为始终信任 macOS 会搞砸事情。 谢谢您!

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