On 2009.11.13 at 04:44:02 -0800, Mansour Dagher wrote:

> Hi all,
> 
> 
> if certificates and associated keys are stored on HW (Sun crypto card for 
> example), is there a way in openssl to specify the card as the location of 
> these certificates/kets?
> 
> It appears from the methods below, the openSSL only takes filesystem 
> directory paths and file names as input for certificate/key locations:
> 
> X509_STORE_load_locations()
> SSL_CTX_use_certificate_chain_file()
> SSL_CTX_use_PrivateKey_file()
> 
> Any suggestions/thought?

There is SSL_CTX_use_PrivateKey which allows you to use private key
already loaded into memory as EVP_PKEY structure.

There is ENGINE_load_private_key function, which allows to create
EVP_PKEY structure engine-specific way. Engine is a module, which
handles interaction with some crypto hardware. Really this EVP_PKEY can
contain just reference for key stored in the hardware.

If engine-initialization code sets up an RSA/DSA/other PKEY method which
knows how to hand of crypto operation to the hardware, you can use 
key stored on the token (and never actually leaves it) for all
operations - either PKCS7/CMS/SMIME or SSL/TLS.

If you store trusted CA certificates on the token as well, engine module 
can also provide X509_STORE method, which can be used for certificate
verification. I don't remember in which version of OpenSSL support for
engine-provided X509_STORE method is appeared.

Things are somewhat worse for certificates for the your private key.

There was no ENGINE api to load certificates from token in the 0.9.8
version.

In the 1.0.0 function ENGINE_load_ssl_client_cert appeared, which allows
you to load certificate/private key pair given list of CA names
acceptable by server. This function seems to be designed for use from
SSL client certificate callback.

But there still no API for loading SSL server certificate/key pair and
for loading SMIME certificate/key pair, not to mention loading
certificate with arbitrary extendedKeyUsage.

But main problem is that when one want to use hardware token with
OpenSSL, it typically means tha one want to use token with existing
openssl applications, such as Apache, Lynx, OpenVPN etc.


OpenVPN has some support for PKCS#11 modules, but I've never tried it.

Other applications cannot make use of OpenSSL engine API without
modifications. 

I'm not sure that they can work with X509_STORE method provided by
engine, even this method is set as default. Some client applications
such as lynx and wget are happy with X509_STORE_set_default_locations,
but most server applications want greater control on trusted CA store.

Few years ago I've submitted patch for PostgreSQL which allows to use
keys loaded via ENGINE_load_private_keys to connect to PostgreSQL
database and this patch got into PostgreSQL 8.3 version.
But that time there was no API to load certificates. Now, when we have 
ENGINE_load_ssl_client_cert and PostgreSQL 8.4 have certificate
authentication support may be it is time for new patch.







> Thank you in advance.
> 
> 
>       
> ______________________________________________________________________
> 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