In that case look for the CryptoAPI engine for openssl, not sure of its official name though.

On 10/29/2011 8:21 AM, Andrejs Štrumfs wrote:
Duh... I was sure these were the needed parts. Now, I tried to call 
CryptExportKey with PRIVATEKEYBLOB flag, and of course it returned error, 
because the certificate was imported to store without Mark as Exportable 
option. But there has to be way to use certificate and private key somehow with 
OpenSSL? I'm really beginner with this certificate thing, maybe I just don't 
understand something? :)

Simple, really:

You have not set the "private" part of the private key (d, p, q, dmp1,
dmq1, iqmp).

You need to export the private key from CryptoAPI too, and convert that
blob, not the public key blob.

Alternatively, I have heard rumors of a "CryptoAPI engine" plug in for
OpenSSL which will let OpenSSL directly use the keys and certificates
stored by Windows.


On 10/28/2011 9:48 AM, Andrejs Štrumfs wrote:
Hi!

I am trying to make a program, that uses some Web Services in Delphi
XE. To connect to the Web Services, i have to use self signed (hope
this is correct term) certificate, which is stored in Windows cert
store. So, i open the cert store with CertOpenSystemStore, get cert
with CertFindCertificateInStore and set it with
SSL_CTX_use_certificate. No problem with this. Then i get the public
key blob with CryptExportKey and make up a private key like this:
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;

and set it up with SSL_CTX_use_PrivateKey and
SSL_CTX_check_private_key. Also, no problem so far. But then, when data
transfer begins, i get access violation in libeay32.dll - Access
violation at address 09881C5F in module 'libeay32.dll'. Read of address
00000000. If i load the key from .pem file, everything is fine.
The libeay32.dll version is 1.0.0.5. Tried with version 0.9.something
too - got the same error, just different address.
Below is the RSA structure i get in 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

I checked the n and e bignums, and they are CORRECT, and everything
else looks ok. The error happens when calling function ssl_read. I
can't see what i am doing wrong, please help :) Thanks

Andrejs

______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           majord...@openssl.org
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           majord...@openssl.org

______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to