And*_*ejs 27 windows delphi openssl certificate-store
我正在尝试制作一个在Delphi XE中使用某些Web服务的程序.要连接到Web服务,我必须使用自签名证书,该证书存储在Windows证书库中.我使用CertOpenSystemStore打开证书库,获取证书CertFindCertificateInStore并进行设置SSL_CTX_use_certificate.没问题.然后我得到公钥blob CryptExportKey并组成一个私钥,如下所示:
function PrivKeyBlob2RSA(const AKeyBlob: PByte; const ALength: Integer; const ASSLCtx: PSSL_CTX): IdSSLOpenSSLHeaders.PEVP_PKEY;
var
modulus: PByte;
bh: PBLOBHEADER;
rp: PRSAPUBKEY;
rsa_modlen: DWORD;
rsa_modulus: PAnsiChar;
rkey: PRSA;
begin
bh := PBLOBHEADER(AKeyBlob);
Assert(bh^.bType = PUBLICKEYBLOB);
rp := PRSAPUBKEY(AKeyBlob + 8);
Assert(rp.magic = $31415352);
rsa_modulus := PAnsiChar(Integer(Pointer(rp))+12);
rkey := RSA_new_method(ASSLCtx.client_cert_engine);
rkey^.References := 1;
rkey^.e := BN_new;
rkey^.n := BN_new;
BN_set_word(rkey^.e, rp^.pubexp);
rsa_modlen := (rp^.bitlen div 8) + 1;
modulus := AllocMem(rsa_modlen);
CopyMemory(modulus, rsa_modulus, rsa_modlen);
RevBuffer(modulus, rsa_modlen);
BN_bin2bn(modulus, rsa_modlen, rkey^.n);
Result := EVP_PKEY_new;
EVP_PKEY_assign_RSA(Result, PAnsiChar(rkey));
end;
Run Code Online (Sandbox Code Playgroud)
然后,我将它设置SSL_CTX_use_PrivateKey和SSL_CTX_check_private_key-没有问题为止.但是当数据传输开始时,我在libeay32.dll中遇到了访问冲突.如果我从.pem文件加载密钥,一切都很好.我看不出我做错了什么,请帮忙:)
这是确切的错误消息:
模块'libeay32.dll'中地址09881C5F的访问冲突.读取地址00000000.
libeay32.dll版本是1.0.0.5.试过版本0.9.something也 - 得到相同的错误,只是不同的地址.
以下是我收到的RSA结构PrivKeyBlob2RSA:
pad 0
version 0
meth $898030C
engine nil
n $A62D508
e $A62D4D8
d nil
p nil
q nil
dmp1 nil
dmq1 nil
iqmp nil
ex_data (nil, -1163005939 {$BAADF00D})
references 1
flags 6
_method_mod_n nil
_method_mod_p nil
_method_mod_q nil
bignum_data nil {#0}
blinding nil
mt_blinding nil
Run Code Online (Sandbox Code Playgroud)
我检查了n和e bignums,它们是正确的,其他一切看起来都不错.是的,调用函数时会发生错误ssl_read.
War*_* P 1
在我看来,出现这些错误的最合理原因包括:
OpenSSL dll (libeay32 ssleay.dll) 版本错误或声明 SSL 包装器时出错(在这种情况下,您可能需要 Indy 版本 10 升级)。
根据 Ken 的评论,已经释放了要传递到 DLL 的内存块。
您发布的代码中存在一些微妙的指针取消引用错误。对 CopyMemory 的调用可能会缺少通过“PointerVariableName^”而不仅仅是“PointerVariableName”的指针间接级别。如果您不清楚,请阅读“pascal 中的无类型 var 参数和指针”。
| 归档时间: |
|
| 查看次数: |
3478 次 |
| 最近记录: |