tutorial online for fake create windows delphi openssl certificatestore

online - Uso de certificado y clave privada de Windows cert store con OpenSSL



ssl certificate online generator (1)

Estoy tratando de crear un programa que use algunos servicios web en Delphi XE. Para conectarme a los servicios web, tengo que usar un certificado autofirmado, que se almacena en la tienda de certificados de Windows. Abrí la tienda de certificados con CertOpenSystemStore, obtuve el CertFindCertificateInStore con CertFindCertificateInStore y lo configuré con SSL_CTX_use_certificate . No hay problema con esto Luego obtengo el blob de clave pública con CryptExportKey y CryptExportKey una clave privada como esta:

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;

Luego lo configuré con SSL_CTX_use_PrivateKey y SSL_CTX_check_private_key - sin problema hasta el momento. Pero cuando comienza la transferencia de datos, aparece una infracción de acceso en libeay32.dll. Si cargo la clave desde el archivo .pem, todo está bien. No puedo ver lo que estoy haciendo mal, por favor ayuda :)

Aquí está el mensaje de error exacto:

Infracción de acceso en la dirección 09881C5F en el módulo ''libeay32.dll''. Lectura de la dirección 00000000.

La versión libeay32.dll es 1.0.0.5. Intenté con la versión 0.9.algo también: recibí el mismo error, solo una dirección diferente.

A continuación se muestra la estructura de RSA que obtengo 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

Verifiqué los n y e bignums, y están CORRECTOS, y todo lo demás se ve bien. Y sí, el error ocurre cuando se llama a la función ssl_read .


Me parece que las razones más razonables por las que obtendría estos errores incluyen:

  1. Versión incorrecta de dlls de OpenSSL (libeay32 ssleay.dll) o error al declarar contenedores de SSL (en este caso, es posible que necesite una actualización de Indy versión 10).

  2. Después de haber liberado el bloque de memoria que está pasando a la DLL, según el comentario de Ken.

  3. Algún error sutil de desreferenciación del puntero en el código que publicaste. Una llamada a CopyMemory podría perder un nivel de indirección de puntero a través de "PointerVariableName ^" en lugar de solo "PointerVariableName". Lea sobre "parámetros var no tipados y punteros en pascal" si no está seguro.