private key not available for client_cert_cb

Jan Just Keijser janjust at nikhef.nl
Mon Jan 11 16:01:56 UTC 2021


Hi,

On 08/01/21 22:35, George wrote:
> Hi,
>
>    I have been trying to setup mutual authentication using a smart 
> card but I can't seem to get the OpenSSL Engine to send a response 
> back to the server containing client's certificate from the smart card.
>
> I'm using the following to configure the certificate and private key:
>
>     ENGINE_ctrl_cmd(engine, "LOAD_CERT_CTRL", 0, &cert_info, NULL, 0);
>     SSL_CTX_use_certificate(sslContext, cert_info.cert);
>
>     EVP_PKEY* privateKey = ENGINE_load_private_key(engine, 
> "2b2586c684d69b670c0a805edf514e720f2b757d8e2faa0b3a7ff23d1ccfc7ba", 
> transfer_pin, &cb_data);
>     SSL_CTX_use_PrivateKey(sslContext, privateKey);
>
> (I have been using the code in 
> https://github.com/jjkeijser/ppp/blob/eap-tls/pppd/eap-tls.c as a guide.)
>
> This seems be successful. However, when I start the mutual 
> authentication with
> SSL_connect(ssl)
> , the mutual authentications handshake fails. I can see the server 
> requesting the certificate from the client and the client sends back 
> an ACK for this message. However, the client does not send the 
> certificate to the server.
>
> I was looking through the OpenSSL code openssl-1.0.2u\ssl\ssl_rsa.c 
> and noticed something interesting. The comment indicates that the flag 
> *RSA_METHOD_FLAG_NO_CHECK* should be set for smart cards:
>
> static int ssl_set_pkey(CERT *c, EVP_PKEY *pkey)
> {
>  . . .
> #ifndef OPENSSL_NO_RSA
> *   /***
> **         * Don't check the public/private key, this is mostly for 
> smart**
> **         * cards.**
> **         */*
>         if ((pkey->type == EVP_PKEY_RSA) &&
>             (RSA_flags(pkey->pkey.rsa) & RSA_METHOD_FLAG_NO_CHECK)) ;
>         else
> #endif
> . . .
> }
>
> However, it is not actually set when I use a debugger to inspect the 
> flag. Does it need to be set? If so, how is this done? I could not 
> find anything related to this in
> https://github.com/jjkeijser/ppp/blob/eap-tls/pppd/eap-tls.c


if you read through the code blob that Michael pointed you to, you will 
find that this flag needs to be set *under certain circumstances* when 
using smartcards. It has to do mostly with the situation where
- private key is on the smart card
- the public key/certificate is NOT on the smart card
- you ask OpenSSL to verify the private key without explicitly providing 
a public key.

I've never run into this issue, but then again, I have not tested very 
often the case where the certificate was not present on the HSM/smart 
card but the private key is.  YMMV.

As for using pksc11helper versus using libp11: that is just a matter of 
taste. I used the engine_pkcs11 + libp11 route for the eap-tls code , 
mostly because it was the first "working" set of tools I found at the time.

You can also take the "pkcs11helper" route, which is what OpenVPN does 
(see https://github.com/openvpn).  Both methods have pro's and con's.

Do you run into problems if you DO not set the RSA_METHOD_FLAG_NO_CHECK 
flag?  All that flag does is to stop OpenSSL from verifying that a 
public key/cert and private key match/belong together for RSA keys only; 
if your smartcard supports EC keys then this flag will do you no good.

HTH,

JJK

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mta.openssl.org/pipermail/openssl-users/attachments/20210111/4880dcd6/attachment.html>


More information about the openssl-users mailing list