问题标签 [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 回答
158 浏览

c++ - C++ Schannel POST 400 错误代码错误请求

出于某种原因,我不知道 POST 请求不起作用。我很确定问题出在 POST string"POST /profile.php HTTP/1.1\r\nid=2323\r\nContent-Length: \r\n\r\n"上。GET 请求正常工作,但 POST 请求不能正常工作。

我使用 TLS VER 1.0 通过端口 443 连接到服务器

这是我从服务器获得的错误代码。编辑:我正在尝试编辑这篇文章以修复它,它告诉我我的帖子主要是代码,但我希望不再是。

0 投票
0 回答
231 浏览

c - 为什么 SChannel TLS 将消息限制为 32kb

我正在使用 SChannel 构建客户端/服务器程序。我想做的一件事是文件共享。我找到了一些使用 Schannel 进行通信的客户端程序的示例代码,我想知道为什么消息的最大大小是 32kb。这是执行接收的示例函数

代码来自我在这里找到的 Github:https ://github.com/odzhan/shells/blob/master/s6/tls.c

在他定义的一个头文件中

我还在其他地方读到这是 TLS 的限制。是否有可能增加该限制?如果我需要收到更多,会发生什么?像一个大文件?

0 投票
2 回答
176 浏览

ssl - 如何检测基于 SChannel 的 HTTPS 客户端中的终止字符

我搜索了 StackOverflow 试图找到类似的问题,但没有遇到过,所以我发布了这个问题。

我正在尝试使用 Microsoft 的 SChannel 库编写一个 C++ HTTPS 客户端,并且在分块消息传输时遇到随机错误。这个问题似乎只发生在很长的下载中——短的下载通常可以正常工作。大多数情况下,代码都能正常工作——即使是长时间下载——但偶尔 recv() 命令会优雅地超时,断开我的 TLS 会话,在其他时候,我会收到一个不完整的最后一个数据包。随机错误似乎是服务器用于传递数据的不同大小的块和加密块的结果。我知道我需要处理这种变化,但是虽然这在未加密的 HTTP 连接上很容易解决,但加密方面给我带来了问题。

首先是超时问题,大约 5% 的时间我请求大型 HTTP 请求(来自单个 HTTP GET 请求的大约 10 MB 数据)。

超时是因为在最后一个块上我指定了比阻塞套接字上剩余的数据更大的接收缓冲区。对此的明显解决方法是只请求下一个块所需的字节数,这就是我所做的。但是由于某种原因,从每个请求中收到的数量少于我的请求,但解密后似乎没有丢失任何数据。我猜这一定是由于数据流中的一些压缩,但我不知道。无论如何,如果它使用压缩,我不知道如何将解密的未压缩字节流的大小转换为压缩的加密字节流的大小,包括加密头和尾,以请求准确的字节数。谁能帮我做到这一点?

另一种方法是让我连续查找两个 CR+LF,这也表示 HTTPS 响应的结束。但是由于数据是加密的,我无法弄清楚如何逐字节查看。SChannel 的 DecryptMessage() 似乎是按块进行解密,而不是逐字节进行。该论坛中的任何人都可以就如何逐字节解密以使我能够查找分块输出的结尾提供任何建议吗?

第二个问题是 DecryptMessage 有时会错误地认为它在我到达消息的实际结尾之前完成了解密。结果行为是我继续下一个 HTTP 请求,并且我得到了前一个响应的其余部分,我希望看到新请求的标头。

显而易见的解决方案是检查解密消息的内容,看看我们是否真的到达了终点,如果没有,在发送下一个 HTTP 请求之前尝试接收更多数据。但是当我这样做并尝试解密时,我会收到一条解密错误消息。

任何人都可以就策略提供的任何建议/帮助将不胜感激。我已经附上了 HTTP 正文的读取/解密过程的相关代码部分——我不包括标题读取和解析,因为它可以正常工作。

0 投票
1 回答
146 浏览

ssl - SSPI Schannel API 返回 0xAE06 或 CALG_ECDH_EPHEM 的未记录值

我正在使用以下代码查询当前的 TLS 连接:

它返回所有字段的正确结构:

根据 MSDN 文档:https ://docs.microsoft.com/en-us/windows/win32/api/schannel/ns-schannel-secpkgcontext_connectioninfo

但是,该字段aiExch的值为 0xAE06 我猜(来自 wincrypt.h 文件)定义为CALG_ECDH_EPHEM,但文档只提到了两个可能的值:

现在的问题:

  1. 0xAE06 / CALG_ECDH_EPHEM 是什么意思?
  2. 该字段aiExch还可以具有哪些其他值?
0 投票
1 回答
75 浏览

c++ - 未解析的外部符号 __imp_CertFindChainInStore C++ SCHANNEL

未解决的外部符号 __imp_CertFindChainInStore 编译错误

似乎如果我包含 CertFindChainInStore 我的程序将无法编译 https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certfindchaininstore

0 投票
1 回答
820 浏览

git - Visual Studio 2019 + Bundled Git - SChannel 加密提供程序在独立 Git 安装成功的情况下失败

背景

我们的组织通过在我们的域控制器上使用组策略来分发内部证书。对于我们的 git 安装,这意味着我们需要使用“Windows 安全通道”库进行 HTTPS 连接,而不是 OpenSSL。


问题

尝试使用带有 schannel 的 VS2019 Enterprise 捆绑 Git 连接到远程 Git 存储库失败并出现错误:

schannel: next InitializeSecurityContext failed: Unknown error (0x80092013) - The revocation function was unable to check revocation because the revocation server was offline

当我使用 VS2019 UI 尝试与 repo 同步时,以及通过命令行运行它时,都会出现此错误。(我正在使用的可执行文件的路径是C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\cmd\git.exe

但是,如果我运行与 VS2017 捆绑的 git 可执行文件,我可以成功与 repo 同步(可执行路径:)C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\cmd\git.exe。但是,如果我打开 VS2017 并尝试使用 UI,我会得到与上面相同的 schannel 错误!


概括

执行 git 的独立安装并使用 Windows 安全通道设置它成功连接到远程存储库。

无论是使用 IDE UI 还是通过命令行,VS2019 捆绑的 git 都不起作用。

VS2017 捆绑的 git 在命令行中工作,但不能通过 IDE UI。


配置文件

我的全局 .gitconfig 如下所示:

VS2019 .gitconfig 看起来像这样:

VS2017 的 .gitconfig 看起来像这样(和 VS2019 完全一样):

0 投票
1 回答
32750 浏览

windows - 什么是 Schannel TLS 致命警报代码?

在哪里可以找到事件查看器中显示的 Windows Schannel 致命警报代码的定义?例如:

  • 从远程端点收到致命警报。TLS 协议定义的致命警报代码是40
  • 已生成致命警报并将其发送到远程端点。这可能会导致连接终止。TLS 协议定义的致命错误代码是70。Windows SChannel 错误状态为 105。
0 投票
1 回答
773 浏览

c++ - AcquireCredentialsHandleA() 为 PFX 文件返回 0x8009030e(安全包中没有可用的凭据)

我正在尝试使用 SSPI 设置服务器端加密。我已成功(据我所知)加载存储为 PFX 文件的证书,但调用m_pSSPI->AcquireCredentialsHandleA()返回0x8009030e.

此方法似乎成功加载文件并返回一个CERT_CONTEXT对象。

结果立即传递给另一个类方法,该方法AcquireCredentialsHandleA()调用失败。

我的CTLSPackage::AcquireCredentials()代码路径也用于设置客户端加密,并且有效。对于服务器端路径,m_fServerTRUE. 该m_hCrypt32成员是从 加载的Crypt32.dll

我已经从示例中拼凑出这段代码,但我必须为服务器案例遗漏一些东西。我只需要设置 SSL/TLS 样式的加密,因此“安全包中没有可用的凭据”错误很奇怪,因为我不需要凭据身份验证。

有谁知道可能缺少什么?谢谢!

0 投票
1 回答
93 浏览

authentication - 如何使用 Schannel 引发客户端证书请求

我正在使用 schannel 编写 TLS 服务器端代码,并且需要要求客户端相互验证自己。我知道这是通过在服务器问候结束时发送客户端证书请求来完成的。我看到如何在 openssl 中执行此操作,但我无法找到如何使用 schannel 执行此操作。

编辑。

简短的回答是使用 ASC_RET_MUTUAL_AUTH。

0 投票
2 回答
532 浏览

c++ - SChannel 中的密码套件选择

我已经实现(Windows 10.0.17763.0/VS2017/C++)一个客户端/服务器应用程序,它使用 schannel 进行安全通信。现在的要求是仅使用一组密码套件来进行某些客户端和服务器之间的通信。

使用 BCryptAddContextFunction/BCryptRemoveContextFunction API,我可以更改 SChannel 中支持的密码,但这是系统范围的设置,不仅适用于我的应用程序。为了以编程方式控制它,我尝试在 AcquireCredentialsHandle 中使用 ALG_ID。以下是我的应用程序应该支持的唯一密码套件。

  • TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

所以我构建了如下所示的 ALG_ID。

使用wireshark我发现下面是我的应用程序使用上面的ALG_ID在客户端hello中提出的密码套件,

  • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

问题是,

  1. 我如何允许AES_GCM批量加密?当我将 CALG_AES 添加到列表中时,AES_GCMAES_CBC 都被允许。
  2. 我如何控制签名?添加 CALG_ECDH_EPHEM 启用了 TLS_ECDHE_ECDSA 和 TLS_ECDHE_RSA,我只需要 TLS_ECDHE_RSA。将 CALG_RSA_SIGN 添加到 ALG_ID 删除了 TLS_ECDHE_ECDSA 但它盯着允许 TLS_RSA_* 密码套件。