So the string that the capi engine needs is a comma separated string of the 
entry values like what is returned by CertNameToStr with CERT_SIMPLE_NAME_STR 
type.

The only problem the I seem to run into is when dealing with extended 
characters. CertNameToStr seems to output a correct looking string but the 
values I get from
ASN1_STRING_data( X509_NAME_ENTRY_get_data(subject)), doesn't seem to display 
the characters correctly. The extended characters seem to come in as 2 
character. This is probably and encoding issue so I tried using 
ASN1_STRING_to_UTF8 with no luck.

Any ideas of what the difference may be?

-----Original Message-----
From: owner-openssl-us...@openssl.org [mailto:owner-openssl-us...@openssl.org] 
On Behalf Of Fili, Tom
Sent: Friday, September 27, 2013 2:14 PM
To: openssl-users@openssl.org
Subject: RE: CAPI and Private keys

My mistake. I was looking at Common Name, Organization Unit Name, Organization 
Name. I can definitely see collisions with this approach.

If I want to make a more specific string to avoid any wrong certificates, what 
format should it be in for the capi engine to accept is.

I've tried

X509_NAME_oneline(X509_get_subject_name(m_pX509), buffer, sizeof(buffer));

But that doesn't work.

Should it just be comma separated values or something like "SN=value,SN=value"?

-----Original Message-----
From: owner-openssl-us...@openssl.org [mailto:owner-openssl-us...@openssl.org] 
On Behalf Of Dr. Stephen Henson
Sent: Thursday, September 26, 2013 2:08 PM
To: openssl-users@openssl.org
Subject: Re: CAPI and Private keys

On Thu, Sep 26, 2013, Fili, Tom wrote:

> Hmmm...ok. Is it possible that in some cases passing the subject to 
> ENGINE_load_private_key is the incorrect thing to do?
> 
> What I'm doing seems pretty simple but in some cases I get key/value mismatch 
> errors.
> 
> I get the PCCERT_CONTEXT from the windows certificate store.
> 
> Then do the following to get the X509 structure and the private key
> 
> PCCERT_CONTEXT context;
> ...
> const unsigned char *pData = context->pbCertEncoded;
>  X509* pX509 = d2i_X509(0, &pData, context->cbCertEncoded); // Get 
> Subject if (X509_NAME* subject = X509_get_subject_name(pX509))
>     {
>         for(int nid=0;nid<3;++nid)
>         {
>             X509_NAME_get_text_by_NID(subject, NIDs[nid], buffer, 
> sizeof(buffer));
>             if( buffer[0] != '\0' )
>             {
>                 m_subject = buffer;
>                 break;
>             }
>         }
>     }
> EVP_PKEY *pkey = ENGINE_load_private_key(e, m_subject, 0, 0);
> 
> Then I set the context to use the certificates
> 
> int errCode = SSL_CTX_use_certificate(context, pX509); errCode = 
> SSL_CTX_use_PrivateKey(context, pkey);
> 
> I don't seem to have any idea how there can be a mismatch. 
> 

You don't indicate what the "NIDs" array is. It's possible that there are 
multiple certificates matching the values you look up and
ENGINE_load_private_key() just finds the first one which may not be the one you 
want.

Steve.
--
Dr Stephen N. Henson. OpenSSL project core developer.
Commercial tech support now available see: http://www.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


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

Reply via email to