问题标签 [schannel]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
330 浏览

c - 使用 CAPI 时是否可以替换 ENGINE_load_private_key()?

在为 OpenSSL 和客户端证书使用 Windows 密钥存储的过程中,我发现了这篇文章: https ://anexdev.blogspot.com/2018/10/how-to-send-client-certificate-with.html

除了给定代码中的一些错别字之外,该示例启发我编写了一些代码,这些代码利用 ENGINE CAPI 进行密钥使用。总而言之,在商店 ( L"MY") 中找到证书后,我能够发出 ENGINE_load_private_key() 最终返回一个新分配的 EVP_PKEY 结构。

但是我无法将此密钥与证书结合使用。经过一番调查,我发现该结构仅包含一个版本、一个模数和一个 pubkey 组件:

因此,我查看了 OpenSSL 实现的代码。事实上, ENGINE_load_private_key() 至少在 CAPI 引擎明显不打算导出私钥的情况下。

openssl/crypto/engine/eng_pkey.c中,该函数调用load_privkey()所选引擎的成员。对于 CAPI,实现在openssl/engines/e_capi.c中定义。此函数调用capi_find_key()以查找密钥并capi_get_pkey()接收它。

仔细研究static EVP_PKEY *capi_get_pkey(ENGINE *eng, CAPI_KEY *key)似乎可以解释我的问题的根源:

为什么用capi_get_pkey()调用?这是故意规避 Windows 的任何规则并由于已知的 Windows 错误而提取私钥,还是 <code>ENGINE_load_private_key() 实际上与 CAPI 结合使用?CryptExportKey()PUBLICKEYBLOB

有谁知道我的应用程序的 <code>ENGINE_load_private_key() 替代品?

0 投票
0 回答
258 浏览

windows - 禁用已修改协议但仍无法正常工作的 TSL1.0 和 TSL1.1

我一直在尝试禁用 TLS1.0 和 TLS1.1,但没有成功。我们已经在 regedit 中禁用了它们,并重新启动了系统。

我们已确保正确保存的值,并且我们支持 TLS1.2 并且它已启用。 https://www.ssllabs.com/ssltest/analyze.html?d=www.gocare.biz这是我们看到它们仍然处于启用状态的地方。我们使用的是 Windows Server 2012 R2。我们只希望服务器只接受 TSL 1.2 和 TSL 1.3。我们不知道禁用它还能做什么。谢谢

0 投票
2 回答
463 浏览

go - go 是否实现了自己的 ssl 库?

我需要知道编译器使用哪个 ssl 实现。我必须构建一个支持 ssl 的应用程序,并且正在徘徊在每个平台上 golang 依赖的 ssl 库。我环顾四周,只发现了这个,但由于它很旧,我不知道它是否仍然有效。

0 投票
2 回答
906 浏览

.net - .NET 中非常奇怪的 SSL 错误:无法仅为特定 URL 解密指定的数据

我正在使用 .NET 从 URL 下载数据。对于大多数 URL,它没有问题,但对于一个特定的 URL,当我尝试建立连接时,我遇到了一个非常奇怪的错误。此外,该错误仅在第二次(及后续)尝试发出请求时发生。第一次似乎总是有效。

这是一些演示该问题的示例代码:

备注

  • 使用指定 URL 以外的任何其他 URL 似乎都有效。甚至同一服务器上的其他 URL(使用相同的证书)也可以正常工作。例如,https://health-infobase.canada.ca/pass
  • 我将 SChannel 日志记录级别提高到 3(警告和错误),但在 Windows 事件日志中没有看到来自 SChannel 源的任何内容。
  • 该问题发生在 .NET 4.8 (528372) 和 .NET Core 3.1.7
  • 问题发生在两者WebRequestWebClient
  • 在 .NET Framework 4.8 中,使用时问题似乎消失了WebClient.DownloadData(),但使用时仍然出现WebClient.OpenRead()
  • 在 .NET Framework 4.8 中,问题似乎只发生在下载某些文件的 URL 上(就像我的代码示例中的那个)。但是,在 .NET Core 中,路径在https://health-infobase.canada.ca/src/下的任何 URL 都会发生错误。
  • 如果我使用中间 HTTPS 嗅探器(如 Fiddler),那么问题就会消失。
  • 在 Linux 上的 .NET Core 上运行相同的代码不会出现任何问题。
  • 使用硬连线证书验证回调(ServicePointManager.ServerCertificateValidationCallback总是返回true)没有帮助。

我在.NET Core中运行时的堆栈跟踪如下所示:

.NET Framework上,堆栈跟踪似乎没那么有用:

更新:在 github 上作为问题提交:https ://github.com/dotnet/runtime/issues/43682

0 投票
4 回答
11111 浏览

ssl - curl 错误 35:接收握手失败,SSL/TLS 连接失败

当我尝试执行此 curl 命令时:

curl -v --key some_key_file.key --cert certificate_file.pem --show-error --header "Content-Type: application/json;charset=UTF-8" https://some-api/service

我收到以下错误:curl: (35) schannel: failed to receive handshake, SSL/TLS connection failed

以及完整的执行日志:

在此处输入图像描述

我在网上搜索了这个错误,但没有找到任何人解释它的真正含义。

  • 你知道源头可能是什么吗?
  • 你知道是否有办法获得有关错误的更多信息?
0 投票
1 回答
143 浏览

schannel - 当 InitializeSecurityContext 以 SEC_E_WRONG_PRINCIPAL 失败时获取服务器的证书

当服务器提供的证书上的名称都与 pszTargetName 参数(本质上是服务器的名称)不匹配时,InitializeSecurityContext (Schannel) 失败并显示 SEC_E_WRONG_PRINCIPAL。

如果您有一个完整的安全上下文,您可以通过调用 QueryContextAttributes 获取 SECPKG_ATTR_REMOTE_CERT_CONTEXT 来获取服务器的证书。如果将来自失败的 InitializeSecurityContext 协商的部分形成的安全上下文用作 phContext 参数,则对 QueryContextAttributes 的调用失败并显示 SEC_E_INVALID_HANDLE。

在这种情况下,客户端是否有办法访问服务器发送的证书,以便我们可以报告证书上的名称?

注意。如果我们真的想这样做,我们可能会重做协商,指定 ISC_REQ_MANUAL_CRED_VALIDATION,然后在安全上下文上调用 QueryContextAttributes(然后立即销毁它),但这似乎很愚蠢。

0 投票
0 回答
152 浏览

git - 尝试提取 GIT 存储库时出现吊销证书错误

我知道有一些类似的帖子,但我无法通过那里的答案解决这个问题。

我试过git config —global http.schannelcheckrevoke false了,但无论设置为真还是假,我仍然得到错误。

不应该将 http.schannelcheckrevoke 设置为 false 以防止此错误吗?我在这里想念什么?

0 投票
0 回答
5787 浏览

encryption - TLS 1.2 密码套件错误,Schannel 事件 ID 36874 和 36888

我在 Windows Server 2008 R2 上的 eventvwr 中看到以下一对错误:

An TLS 1.2 connection request was received from a remote client application, but none of the cipher suites supported by the client application are supported by the server. The SSL connection request has failed. 源是 Schannel,事件 ID 是 36874。

The following fatal alert was generated: 40. The internal error state is 1205.源是 Schannel,事件 ID 是 36888。我知道第二个错误基本上只是说 TLS 握手失败,这也是前一个错误所说的。

我可以通过使用 sslscan 故意使这些错误发生,例如,如果我运行sslscan.exe --tls12 --verbose [myserver].com:443,我会看到一个接受的密码列表,后面跟着这个错误: SSL_get_error(ssl, cipherStatus) said: 5

每次我运行它时,我都会在 eventvwr 中得到两对错误,但我不知道为什么或哪些密码有问题。它说 SSL 证书是弱加密的(它使用 sha1RSA),我可以修复它,尽管我不知道这是否与 TLS 错误有关。

我见过其他类似的问题,其响应通常是“禁用注册表中的 schannel 日志记录以隐藏错误”,但这不是解决方法,所以我不愿意这样做。

编辑:我在这里也问了这个问题:https ://docs.microsoft.com/en-us/answers/questions/275585/tls-12-error-schannel-event-id-36874-and-36888.html

我相信有一篇博文可能会给出答案,这里是:https ://blog.ittoby.com/2014/07/why-schannel-eventid-36888-36874-occurs.html

如果我能够在此基础上解决问题,我会用对我有用的方法来添加这个问题的答案。

0 投票
0 回答
42 浏览

.net - 使用相同的 TLS 证书来验证客户端或服务器连接,然后第二次使用失败

我发现了导致 TLS 身份验证失败的特定事件序列,并在之前成功时出现错误“客户端和服务器无法通信,因为它们不具备通用算法”。这是 SChannel 中的错误吗?

使用 .NET 4.7.2 和 c# 开发。

PC 通过相互 TLS 身份验证相互连接。每台 PC 都支持客户端和服务器连接,并且可能是从一台 PC 连接的服务器,但客户端连接到另一台 PC。每台 PC 都有自己的唯一证书 (.pfx),我们将其用于服务器和客户端连接。

例如,PC1 和 PC2 都在与 PC3 通信。PC1 与 PC3 建立连接。PC3使用它的 .pfx调用SslStream.AuthenticateAsServer并且成功了。

然后 PC3 与 PC2 建立客户端连接并使用相同的 .pfx调用SslStream.AuthenticateAsClient 。现在失败并出现错误“客户端和服务器无法通信,因为它们没有通用算法”

有趣的是,如果所有应用程序都重新启动并且以相反的顺序建立连接,那么行为就会发生变化。如果首先建立从 PC3 到 PC2 的客户端连接,则连接成功,但随后从 PC1 到 PC3 的服务器连接失败并出现同样的错误。

一旦连接在一个方向上成功,我们就很好,后续连接也会成功,但如果我们尝试在另一个方向上使用相同的证书,那么除非重新启动应用程序,否则它将失败。

此外,我在“AuthenticateAs”方法中指定了 SslProtocols.None。(推荐用于 .NET 4.7.2 及更高版本)。如果我更改为指定 SslProtocols.Tls12 则两个连接都可以正常工作。

我不知道如何进一步调试。有什么想法吗?SChannel 是否保留某种内部状态,阻止我对客户端和服务器连接使用相同的证书?

我在下面放了一些示例代码来阐明我的意思。请注意,这只是显示“服务器”和“客户端”代码以重现此问题的示例。

0 投票
0 回答
1158 浏览

iis-7 - 如何识别 SCHANNEL 错误的应用程序来源?

最近使用IISCrypto在 IIS Web 服务器上禁用低于 TLS 1.2 的协议。开始在事件日志中看到许多 SCHANNEL 错误,如下所示:

创建 SSL 客户端凭据时发生致命错误。内部错误状态为 10013。

您如何确定哪个应用程序正在记录此错误?