Je suis en train de faire un programme qui utilise des Services Web dans Delphi XE. Pour vous connecter à des Services Web, j'ai utiliser un certificat auto-signé, qui est stocké dans le Windows cert magasin. J'ai ouvert le cert magasin avec CertOpenSystemStore, obtenir le cert avec l' CertFindCertificateInStore
et le mettre à l' SSL_CTX_use_certificate
. Pas de problème avec cela. Puis-je obtenir la clé publique de blob avec CryptExportKey
et de faire une clé privée comme ceci:
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;
Je puis le configurer en SSL_CTX_use_PrivateKey
et SSL_CTX_check_private_key
- pas de problème jusqu'à présent. Mais lorsque le transfert de données commence, je reçois une violation d'accès dans libeay32.dll. Si je charge la clé .fichier pem, tout va bien. Je ne vois pas ce que je fais de mal, s'il vous plaît aider :)
Voici le message d'erreur exact:
Violation d'accès à l'adresse 09881C5F dans le module 'libeay32.dll'. Lire de adresse 00000000.
L'libeay32.dll version 1.0.0.5. Essayé avec la version 0.9.quelque chose de trop eu le même message d'erreur, juste différente de l'adresse.
Ci-dessous est la structure RSA-je obtenir en 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
J'ai vérifié le n et e bignums, et qu'ils sont CORRECTS, et tout le reste semble ok. Et oui, l'erreur se produit lors de l'appel de la fonction ssl_read
.