27 votes

Utilisation du certificat et de la clé privée du magasin de certificats Windows avec OpenSSL

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.

1voto

Warren P Points 23750

Il me semble le plus raisonnable des raisons que vous obtiendriez ces erreurs comprennent:

  1. Mauvaise version de OpenSSL dll (libeay32 ssleay.dll) ou d'une erreur lors de la déclaration de SSL wrappers (dans ce cas, vous pourriez avoir besoin d'un Indy de la Version 10 de mise à niveau).

  2. Ayant déjà libéré le bloc de mémoire que vous êtes de passage dans la DLL, comme par Ken commentaire.

  3. Certains subtil déréférencement du pointeur bug dans le code que vous avez posté. Un appel à CopyMemory est peut-être manquant un niveau d'indirection de pointeur via "PointerVariableName^" au lieu de "PointerVariableName". Lire sur "non typé var paramètres et des pointeurs en pascal" si vous êtes pas clair.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X