- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当使用具有有效上下文的 win32 API 中的 EncryptMessage (SChannel) 时,我以正确的顺序提供了四个缓冲区,我得到了 SEC_E_INVALID_TOKEN 响应,根据文档,该响应是没有找到 SECBUFFER_DATA 类型的缓冲区。我知道应该从连续的内存中分配 pvBuffer 集以提高速度,但为简单起见,我已明确说明什么是什么。谁能看出问题出在哪里?
谢谢,布鲁斯
代码如下;
procedure TTCPSocket.SSPEncryptBuffer(SSPCtx: PCtxtHandle; InData: PAnsiChar; InDataLength: Cardinal);
var
SecStatus: TSecurityStatus;
SecBufDesc: TSecBufferDesc;
SecBufs: packed array [0 .. 3] of TSecBuffer;
begin
SecBufs[0].BufferType := SECBUFFER_STREAM_HEADER;
SecBufs[0].cbBuffer := FSecPkgSizes.cbHeader;
SecBufs[0].pvBuffer := AllocMem(FSecPkgSizes.cbHeader);
SecBufs[1].BufferType := SECBUFFER_DATA;
SecBufs[1].cbBuffer := InDataLength;
SecBufs[1].pvBuffer := InData;
SecBufs[2].BufferType := SECBUFFER_STREAM_TRAILER;
SecBufs[2].cbBuffer := FSecPkgSizes.cbTrailer;
SecBufs[2].pvBuffer := AllocMem(FSecPkgSizes.cbTrailer);
SecBufs[3].BufferType := SECBUFFER_EMPTY;
SecBufs[3].cbBuffer := 0;
SecBufs[3].pvBuffer := nil;
SecBufDesc.ulVersion := SECBUFFER_VERSION;
SecBufDesc.cBuffers := 4;
SecBufDesc.pBuffers := @SecBufs[0];
SecStatus := EncryptMessage(SSPCtx, 0, @SecBufDesc, 0);
if SecStatus <> SEC_E_OK then
begin
// Error code..
end;
end;
我将 STRACE 注入(inject)到可执行文件中,这一行看起来很有趣;
12/07/2009 23:10:30:635 - SecBuffer #0 BufferType:0x00000007 cbBuffer:5
12/07/2009 23:10:30:636 - SecBuffer #1 BufferType:0x00000001 cbBuffer:13
12/07/2009 23:10:30:636 - SECBUFFER_DATA - 13 byte(s) / EncryptMessage - INPUT
=====================================================
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 0123456789abcdef
0000: 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 00 hello world!.
=====================================================
12/07/2009 23:10:30:636 - SecBuffer #2 BufferType:0x00000006 cbBuffer:36
12/07/2009 23:10:30:636 - SecBuffer #3 BufferType:0x00000000 cbBuffer:0
12/07/2009 23:10:30:636 -
*** WARNING : EncryptMessage failed (80090308) ***
看起来操作系统正在获取正确的信息。
我搜索了一下,发现 80090308 通常意味着证书有问题,服务器的全名应该在主题中,CN=www.foobar.com 但这也没有解决问题,证书和 CA 是使用 OpenSSL 生成的。
最佳答案
这里有点猜测,因为这似乎是人们在 Windows 上尝试使用非对称加密做任何事情时遇到的常见问题。
如果它是自签名 CA,并且您的证书是使用自签名 CA 签名的,则需要将 CA 导入计算机的受信任 CA 存储区。
为此,运行 MMC 并执行以下操作:
文件->添加/删除管理单元
如果要为计算机上的所有用户申请,请添加“证书”管理单元并选择“计算机帐户”。
打开“受信任的根证书颁发机构->证书”树节点。
右键单击“证书”并选择导入。
导入 CA 证书文件。 (它应该可以毫无问题地接受 PEM 编码版本。)
虽然在大多数情况下 CN 需要与计算机证书中的计算机名称相匹配,但如果 CA 未导入到 Windows 信任存储中,CA 验证将失败。
希望对你有帮助。
关于winapi - EncryptMessage 返回 SEC_E_INVALID_TOKEN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1793876/
我一直在关注 SSL/TLS 在线教程(更多的是阅读这些人的源代码并继续学习)但是我在这个 EncryptMessage 部分遇到了一条坎坷的道路,因为它把数据推开了并对错误信息进行加密。 我发送给它
当使用具有有效上下文的 win32 API 中的 EncryptMessage (SChannel) 时,我以正确的顺序提供了四个缓冲区,我得到了 SEC_E_INVALID_TOKEN 响应,根据文
我是一名优秀的程序员,十分优秀!