问题标签 [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 投票
0 回答
74 浏览

ssl - 如何预测 SslEncryptPacket 输出的大小

通常 Win32 API 可以判断所需的输出缓冲区的长度。只需传递 0 作为缓冲区长度,API 返回错误 BUFFER_TOO_SMALL 和所需的字节数。

但它与SslEncryptPacket 不同。它只是返回关于小缓冲区的错误,仅此而已。

还有我认为应该使用的SslLookupCipherLengths ,但是文档没有提供有关如何计算具有该信息的输出缓冲区的线索。

也许你能说出来?通常我会保留 + 千字节,但在我的情况下,我需要确切地知道。

0 投票
1 回答
238 浏览

c - CryptoAPI RSA Schannel 提供程序错误

我正在尝试使用“Microsoft RSA SChannel Cryptographic Provider”生成数字签名。获取容器句柄后,我正在使用 CryptGenKey() 生成签名。但是这个函数返回 FALSE。

CryptGenKey() 的 dwError 返回 80090008。

这同样适用于任何其他提供程序类型。此外,当我尝试为同一提供者创建密钥交换对时,它工作正常。我究竟做错了什么?

谢谢。

0 投票
0 回答
3491 浏览

c# - 对 SSPI 的调用失败,请参阅内部异常。不支持请求的功能

在我的公司,我们有一个用 C# 开发的 Windows 服务,用于处理来自客户端的请求消息,使用 SSLStream 和 Tls12 以及服务器和客户端证书。服务在 Windows Server 2012 上运行良好,包括 Windows 10 PC,无论是在发布模式下执行还是调试检查代码,但是最近在执行 AuthenticateAsServer 时抛出异常。一段代码是:

networkStream 是 NetworkStream 的一个实例,它具有服务的 IP 和端口。serverCertificate 是安装在本地机器存储中的 X509Certificate2,用作自签名。客户具有相同的证书。异常详情如下:

正如我之前提到的,服务一直运行良好,直到不久前。任何帮助将不胜感激。

0 投票
1 回答
1003 浏览

windows - InitializeSecurityContext (Schannel) 意外返回 SEC_I_INCOMPLETE_CREDENTIALS

我已经实现了使用 SSPI 创建安全连接的代码。我用它通过 SMTP 发送邮件。它适用于smtp.gmail.com我尝试过的其他一些服务器。但它不适用于smtp.live.com. 第二次调用InitializeSecurityContext()返回我SEC_I_INCOMPLETE_CREDENTIALS。据我了解,这意味着我需要提供客户端证书。但这是一个公共的免费邮件服务器。它需要什么客户证书?或者也许我使用了一些错误的参数或标志?

我连接到 smtp.live.com:587 最初连接是未加密的纯文本。首先,我发送 EHLO 命令,然后发送 STARTTLS 命令。之后,我使用下面的代码执行 SSL 握手

这是代码:

0 投票
1 回答
168 浏览

windows - AcceptSecurityContext 期间审核失败 4625

我正在使用 AcceptSecurityContext 方法(https://msdn.microsoft.com/en-us/library/windows/desktop/aa374708(v=vs.85).aspx)建立安全连接,但这似乎触发(二)审核Windows事件日志中的失败事件。这些事件的 ID 为 4625,这似乎表明它们代表登录尝试失败,但 AcceptSecurityContext 调用返回状态 SEC_E_OK。怎么会这样?如果它是一个真正的失败,我希望该方法将返回 STATUS_LOGON_FAILURE。并且登录似乎有效,因为我能够继续进行通信。

有谁知道如何避免这些消息?帮助将不胜感激。

该事件似乎仅记录在 Windows 服务器上(我尝试过 2016、2012 和 2008)。我在 Windows 10 上看不到该事件。

0 投票
2 回答
793 浏览

windows - 使用 Schannel 的 DTLS

我正在尝试在 Windows 下使用 Schannel 创建 DTLS“连接”(我正在最近的 Windows 10 版本下进行测试,因此 Schannel 支持的所有 DTLS 版本都应该可用)

我尝试按照文档从工作代码开始建立常规 TLS 连接:

  1. 在第一次通过时使用空输入初始化SecurityContext,在输出时使用 SECBUFFER_TOKEN 和 SECBUFFER_ALERT
  2. AcceptSecurityContext,输入为 SECBUFFER_TOKEN 和 SECBUFFER_EMPTY,输出为 SECBUFFER_TOKEN 和 SECBUFFER_ALERT。
  3. 重复这两个步骤直到成功,然后继续使用 Encrypt/DecryptMessage

这在流模式下工作得非常好(ISC_REQ_SEQUENCE_DETECT | ISC_REQ_REPLAY_DETECT | ISC_REQ_CONFIDENTIALITY | ISC_RET_EXTENDED_ERROR | ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_STREAM

如果我尝试用 ISC/ASC_REQ_DATAGRAM 替换 STREAM,我的 InitializeSecurityContext 会按预期以 SEC_I_CONTINUE_NEEDED 成功,但我的第一个 AcceptSecurityContext 然后以 SEC_E_INVALID_PARAMETER 失败。

我尝试将我的 SCHANNEL_CRED 的 grbitEnabledProtocols 设置为 0 以使用双方记录的默认值,我还尝试将其设置为 SP_PROT_DTLS1_X,但我仍然从我的第一个 ASC 获得无效参数返回。为了以防万一,我还尝试了 DTLS_1_0 常量。

此外,我的注册表设置中默认启用所有安全协议。

根据我对 DTLS RFC 的理解,我的代码在 HelloVerifyRequest 步骤中失败了,并且再次根据我对 RFC 的理解,这部分要求安全提供程序从 ClientHello 消息的几个部分以及源的IP地址。但是,我找不到任何记录方式将此信息传递给 ASC 函数。

(我认为?:))我已经在整个互联网上搜索了 Schannel 下 DTLS 的任何工作示例用法,但没有任何运气。在stackoverflow上,我发现这个问题只是简单地提到它受支持的: Windows 7上的Schannel是否支持DTLS?,而链接的 MSDN 文章只是一个高级概述。

我搜索了与此功能相关的常量的任何使用...我能想到的所有搜索引擎要么是 sspi.h 的副本,要么是索引 Windows API 中的常量的网站......

我知道其他实现(OpenSSL 等)很好地支持 DTLS,但我真的更喜欢使用 Schannel,因为我的代码的其他部分目前在 TLS 模式下与 Schannel 一起工作得很好。

0 投票
1 回答
165 浏览

c++ - 大于 cbmaximummessage 的 Schannel 消息

我在发送大于协商的最大长度的 SChannel TLS 消息时遇到问题。

当使用大于 SecPkgContext_StreamSizes.cbMaximumMessage 的缓冲区调用“EncryptSend”时,服务器(也不由 Wireshark)理解大于 SecPkgContext_StreamSizes.cbMaximumMessage 的部分。

0 投票
1 回答
1585 浏览

ssl - 访问 SSRS 管理时留下 0 个客户端证书可供选择。

环境

在安装了 .Net 4.6.1 并启用 .Net 3.5 作为功能的 Windows 2008 服务器上的 SQL Server 2008 R2 SP3 安装上运行的 Reporting Services。IIS、数据库和报告服务都在本地机器上(在不同的机器上自定义登录 URL,但似乎这无关)。

所做的更改

由于安全原因,我们被迫迁移到 TLS 1.2,所以我们使用 IISCrypto 仅启用 TLS 1.2

结果

从这一刻起,我们仅在尝试访问报告管理站点时才会收到错误消息。在浏览器上,我们收到错误 500 说:

底层连接已关闭:接收时发生意外错误

在 SSRS 日志中,我们可以看到以下异常:

System.Net.WebException:底层连接已关闭:接收时发生意外错误。---> System.ComponentModel.Win32Exception : 客户端和服务器无法通信,因为它们没有共同的算法

调用堆栈在 ReportServer OnInit() 上启动,因此它立即开始失败,并且错误发生在 Reporting Services 初始化时。

在 .Net Framework 上启用跟踪我发现以下消息表明当 SSRS 调用自己的 Web 服务时会发生故障:

事情已经检查

使用中的证书仍然有效,并且它的签名链被放置在适当的“中间”和“根”存储中。

以管理员身份运行应用程序池没有帮助。

使用从 IIS 生成的自定义签名证书没有帮助。

重要提示该问题仅发生在 Reporting Services 管理站点上,报告工作正常

下一步

关于还有什么可以尝试的任何想法?有没有办法知道为什么没有选择安全包?

更新

该问题与 TLS1.2 无关,因为再次启用 TLS 1 我得到了同样的错误。我猜登录 URL 以某种方式涉及。

0 投票
1 回答
2882 浏览

c++ - 如何使用winsock在c++应用程序中实现安全套接字通信?

我正在尝试在 C++ 中实现服务器和客户端之间的安全通信。限制是客户端和服务器都必须在 Windows 上运行并且必须使用 C++。这是我在我的大学从事的一个研究项目。

到目前为止,我发现 SChannel 是最好的选择,但是文档非常混乱,我找不到任何关于如何使用它的指南/教程。我已经看过这个链接https://docs.microsoft.com/en-us/windows/desktop/secauthn/creating-a-secure-connection-using-schannel但仍然不明白如何让它工作。如果这是最好的方法,有人可以指导我吗?

我还研究了使用 CLR 使用 SSLStream 让 .net 在 c++ 应用程序中运行。但是我不能使用它,因为客户端应用程序是线程的,并且线程不能与 CLR 一起使用。

我已经在两者之间建立了一个虚拟客户端和服务器,我只是想保护和加密该通信。

任何帮助是极大的赞赏!

0 投票
2 回答
19368 浏览

windows - Microsoft Windows 上的 DisabledByDefault 和 Enabled SSL/TLS 注册表项有什么区别?

Microsoft 提供了传输层安全性 (TLS) 的最佳实践指南。本文档描述了可以启用或禁用特定协议的注册表项。

https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls#configuring-schannel-protocols-in-the-windows-registry

例如,要启用 TLS 1.2,您可以添加以下注册表项。

DisabledByDefault和 和有什么不一样Enabled?它们似乎是多余的。