问题标签 [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.
c++ - Win SSPI(Schannel) - 谁负责分配和清理内存?
我想通过 Win SSPI(Schannel) 接口建立 TLS 连接。
我正处于加密 - 解密过程的阶段,我发现自己真的很困惑 -谁负责管理内存分配?:
- 当我想向rempte方发送数据包时,我必须先通过调用EncryptMessage函数来加密数据,该函数包含4个缓冲区:缓冲区到标题,缓冲区到数据应该加密,缓冲区到拖车,和类型为 SECBUFFER_EMPTY 的第四个缓冲区(我必须说我不明白它的用途,但在MSDN中被写入添加它。)。现在调用 EncryptMessage 函数时,加密数据在哪里?它会覆盖我作为输入缓冲区发送的数据吗?如果是这样,如果加密数据与我发送的原始缓冲区的大小相比太大,会发生什么?EncrypteMessage 是否分配额外的内存并将其加入原始缓冲区?
- 当我收到数据时,我还收到了一个加密字节流,我必须将加密数据发送到 DecryptMessage 函数。我的问题又是 - SSPI 在哪里找到解密的数据?如果解密数据比原始流短,谁负责释放分配的剩余字节?
- 当我解密消息时,该函数有时会返回 SECBUFFER_EXTRA 类型的缓冲区。在MSDN中写了这个额外缓冲区的含义。再一次,我不完全明白谁在分配这个内存位置,它只是指向我发送的原始流中任何位置的指针吗?
我不确定是否只有熟悉 SSPI 的人才能回答我,也许是熟悉 Microsoft 实现的人。
我将不胜感激任何答案,甚至部分答案将向我解释 SSPI 管理的内部流程是什么。
谢谢!
c++ - 寻找 Platform SDK SSPI(Schannel) 示例 c++
我想看一个演示如何将 SSPI 与 Schannel 一起使用的 Microsoft 示例。
正如我在这里看到的那样,有一个这样的样本,但我找不到它:(
有人可以帮我找到它吗?
提前致谢!
openssl - 在自定义cert_verify_callback中获取服务器发送的openssl x509证书链
我正在考虑使用使用 Windows 系统存储(通过SSL_CTX_set_cert_verify_callback)的一个覆盖默认证书验证过程。该应用程序是一个 Web 客户端,我需要接受添加到系统存储区的公司范围的自签名证书。
一旦我有一个(可能不完整的)链,我
- 创建一个内存中的 WinCrypt 存储,
- 将服务器提供的链(最终证书除外)添加到其中
- 使用 WinCrypt 从临时存储和系统存储中构建完整的链
- 使用 WinCrypt 验证链(从 SSL 对象传递 servername 值)
但是X509_STORE_CTX_get1_chain()返回可信链,它只有在X509_verify_cert()运行后才可用。
我需要的是 X509_STORE_CTX::untrusted (它只有握手的证书),但它显然不是通过 API 导出的。
我可以将最终证书传递给 WinCrypt,但这意味着下载我想避免的中间证书。
我的问题是,我在做一些倒退的事情吗?我应该让 openssl 构建链并进行验证,然后使用 WinCrypt 重做吗?这似乎很恶心。我可以添加一个 X509_STORE_CTX_get_untrusted() 函数并重建 libeay32.dll,但我宁愿不这样做。
windows - 如何将 OpenSSL 密钥文件导入 Windows 证书存储
我有一个 PEM 格式的 OpenSSL 生成的 X.509 证书及其关联的密钥文件。连接到原型服务器时需要此证书进行身份验证。这在 Linux 上运行良好。我一直在使用 Microsoft SChannel API 在 Windows 平台上驱动 SSL/TLS 连接,但我想使用相同的测试证书。我可以右键单击证书文件并将其导入到我的证书存储中,但我相信私钥不会随它一起导入(即使我已将它们连接到同一个文件中)。
当我运行 SChannel 代码时,我在初始化安全上下文(通过 InitializeSecurityContext)时收到“SEC_E_NO_CREDENTIALS”错误。我怀疑这意味着私钥丢失。
有谁知道如何测试位于个人(或“我的”)证书存储中的证书中是否存在私钥,通过“certmgr.msc”访问?是否可以为商店中的证书导入新的密钥文件?
任何见解或建议将不胜感激。
c# - How to Call Schannel Functions from .Net/C#
I am trying to re-order/remove cipher suites due to compliance reasons (I want to use 256 bit AES and ephemeral keys) in .Net. However, using WCF TCP Transport Security, I cede all control over the security to Windows' TLS implementation and its preferred ciphers. I don't want to change the system-level ciphers.
I found this great Microsoft page that lists how to do it at the application level using BCryptEnumContextFunctions, BCryptAddContextFunction, BCryptRemoveContextFunction, but it's all C and I don't have enough P/Invoke experience to even know where to begin. I googled but didn't find anyone doing it.
The C++ code snippets on the MSDN page are below, and I need help converting them to .Net P/Invoke calls:
BCryptEnumContextFunctions
BCryptAddContextFunction
BCryptRemoveContextFunction
Could someone please help me convert these to .Net so I can call them from managed code to adjust the ciphers? Thanks!
Edit:
Later last night, I tried the following in a test program (still have no idea what I'm doing in P/Invoke):
The output right now of the only method I got even this far with is:
c++ - 使用 C++ 的安全套接字连接
我正在尝试让 SSL/TLS 连接在 Windows 中工作。现在我正在使用 Schannel,但我不确定这是正确的方法。这是我的代码。InitializeSecurityContextA() 函数引发异常
ssl - TLS 握手成功后如何从 Schannel 安全包中获取主密钥?
我们正在使用 Windows schannel 安全包实施 EAP-TTLS。对于内部身份验证方法之一,我们需要在 TLS 握手过程中生成的主密钥。
是否有任何 API 可以获取主密钥?
请帮我。让我知道更多细节。提前致谢。
mysql - 读取 sql 数据的 VB.Net 应用程序
我有一个由本地开发人员开发的销售点系统,但我不断收到此错误。当我使用该程序并点击下一步按钮以显示菜单中的下一个项目列表时出现错误。发生这种情况时,程序只会崩溃并关闭。该程序通过在同一台计算机上运行的 mysql 数据库工作。
这是我的事件查看器报告的错误。
事件 ID:36876 来源:Schannel 从远程服务器收到的证书未正确验证。错误代码为 0x80092013。SSL 连接请求失败。附加数据包含服务器证书。
c++ - SCHANNEL TLS 服务器端无法 CertFindCertificateInStore
我正在向服务器端应用程序添加 TLS 加密。我正在使用 Schannel API 添加 TLS。我在使用 CertFindCertificateInStore 时遇到问题。它永远找不到我正在搜索的证书。作为搜索的标准,我使用证书的名称。我现在已经花了很多时间,但不明白为什么它不起作用。任何帮助将不胜感激。我在其中使用的功能如下所示。谢谢,
int ServerCreateCredentials() {
windows - 确定 Schannel 连接的属性 -> 返回未知值
使用 Schannel成功创建安全连接后,我使用QueryContextAttributes () 获取其连接属性,通过SECPKG_ATTR_CONNECTION_INFO
.
返回的结构SecPkgContext_ConnectionInfo
包含 field aiExch
,其中包含我正在寻找的信息 - 即使用的密钥交换算法。
我已经使用了几个月,它总是返回两个预定义值之一,CALG_RSA_KEYX
或者CALG_DH_EPHEM.
但是几周后(当我相信微软发布了 Schannel 更新补丁时)它返回了一个未知值:0x0000ae06
使用这些宏,可以将 ALG_ID 拆分为其组件:
据此,0x0000ae06
将意味着:
类:ALG_CLASS_KEY_EXCHANGE
类型:(7 << 9)
->未定义的
SID:6
->其含义取决于算法的类型
有人遇到同样的问题吗?谁能解释发生了什么,或者0x0000ae06
代表什么?