2012-09-14 14:14:43 +00:00
|
|
|
MozNSS: load certificates from certdb, fallback to PEM
|
|
|
|
|
2012-10-11 09:47:24 +00:00
|
|
|
If TLS_CACERT pointed to a PEM file and TLS_CACERTDIR was set to NSS
|
|
|
|
certificate database, the backend assumed that the certificate is always
|
|
|
|
located in the certificate database. This assumption might be wrong.
|
|
|
|
|
|
|
|
This patch makes the library to try to load the certificate from NSS
|
|
|
|
database and fallback to PEM file if unsuccessfull.
|
2012-09-14 14:14:43 +00:00
|
|
|
|
|
|
|
Author: Jan Vcelak <jvcelak@redhat.com>
|
|
|
|
Upstream ITS: #7389
|
|
|
|
Resolves: #857455
|
|
|
|
|
|
|
|
diff --git a/libraries/libldap/tls_m.c b/libraries/libldap/tls_m.c
|
2013-03-06 22:09:06 +00:00
|
|
|
index 6847bea..8339391 100644
|
2012-09-14 14:14:43 +00:00
|
|
|
--- a/libraries/libldap/tls_m.c
|
|
|
|
+++ b/libraries/libldap/tls_m.c
|
2012-10-11 09:47:24 +00:00
|
|
|
@@ -1412,7 +1412,7 @@ tlsm_ctx_load_private_key( tlsm_ctx *ctx )
|
2012-09-14 14:14:43 +00:00
|
|
|
/* prefer unlocked key, then key from opened certdb, then any other */
|
2012-10-11 09:47:24 +00:00
|
|
|
if ( unlocked_key )
|
2012-09-14 14:14:43 +00:00
|
|
|
ctx->tc_private_key = unlocked_key;
|
2012-10-11 09:47:24 +00:00
|
|
|
- else if ( ctx->tc_certdb_slot )
|
2012-09-14 14:14:43 +00:00
|
|
|
+ else if ( ctx->tc_certdb_slot && !ctx->tc_using_pem )
|
2012-10-11 09:47:24 +00:00
|
|
|
ctx->tc_private_key = PK11_FindKeyByDERCert( ctx->tc_certdb_slot, ctx->tc_certificate, pin_arg );
|
2012-09-14 14:14:43 +00:00
|
|
|
else
|
2012-10-11 09:47:24 +00:00
|
|
|
ctx->tc_private_key = PK11_FindKeyByAnyCert( ctx->tc_certificate, pin_arg );
|
2013-03-06 22:09:06 +00:00
|
|
|
@@ -1909,8 +1909,6 @@ tlsm_deferred_init( void *arg )
|
2012-09-14 14:14:43 +00:00
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
-
|
|
|
|
- ctx->tc_using_pem = PR_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
NSS_SetDomesticPolicy();
|
2013-03-06 22:09:06 +00:00
|
|
|
@@ -2363,15 +2361,9 @@ tlsm_deferred_ctx_init( void *arg )
|
2012-09-14 14:14:43 +00:00
|
|
|
|
|
|
|
/* set up our cert and key, if any */
|
|
|
|
if ( lt->lt_certfile ) {
|
|
|
|
- /* if using the PEM module, load the PEM file specified by lt_certfile */
|
|
|
|
- /* otherwise, assume this is the name of a cert already in the db */
|
|
|
|
- if ( ctx->tc_using_pem ) {
|
|
|
|
- /* this sets ctx->tc_certificate to the correct value */
|
|
|
|
- int rc = tlsm_add_cert_from_file( ctx, lt->lt_certfile, PR_FALSE );
|
|
|
|
- if ( rc ) {
|
|
|
|
- return rc;
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
+
|
|
|
|
+ /* first search in certdb (lt_certfile is nickname) */
|
|
|
|
+ if ( ctx->tc_certdb ) {
|
|
|
|
char *tmp_certname;
|
|
|
|
|
2012-10-11 09:47:24 +00:00
|
|
|
if ( tlsm_is_tokenname_certnick( lt->lt_certfile )) {
|
2013-03-06 22:09:06 +00:00
|
|
|
@@ -2391,8 +2383,31 @@ tlsm_deferred_ctx_init( void *arg )
|
2012-09-14 14:14:43 +00:00
|
|
|
Debug( LDAP_DEBUG_ANY,
|
|
|
|
"TLS: error: the certificate '%s' could not be found in the database - error %d:%s.\n",
|
|
|
|
lt->lt_certfile, errcode, PR_ErrorToString( errcode, PR_LANGUAGE_I_DEFAULT ) );
|
2012-10-31 11:50:15 +00:00
|
|
|
+ }
|
|
|
|
+ }
|
2012-09-14 14:14:43 +00:00
|
|
|
+
|
|
|
|
+ /* fallback to PEM module (lt_certfile is filename) */
|
2012-10-31 11:50:15 +00:00
|
|
|
+ if ( !ctx->tc_certificate ) {
|
|
|
|
+ if ( !pem_module && tlsm_init_pem_module() ) {
|
|
|
|
+ int pem_errcode = PORT_GetError();
|
|
|
|
+ Debug( LDAP_DEBUG_ANY,
|
|
|
|
+ "TLS: fallback to PEM impossible, module cannot be loaded - error %d:%s.\n",
|
|
|
|
+ pem_errcode, PR_ErrorToString( pem_errcode, PR_LANGUAGE_I_DEFAULT ), 0 );
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
+
|
2012-09-14 14:14:43 +00:00
|
|
|
+ /* this sets ctx->tc_certificate to the correct value */
|
|
|
|
+ if ( !tlsm_add_cert_from_file( ctx, lt->lt_certfile, PR_FALSE ) ) {
|
|
|
|
+ ctx->tc_using_pem = PR_TRUE;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ( ctx->tc_certificate ) {
|
|
|
|
+ Debug( LDAP_DEBUG_ANY,
|
|
|
|
+ "TLS: certificate '%s' successfully loaded from %s.\n", lt->lt_certfile,
|
|
|
|
+ ctx->tc_using_pem ? "PEM file" : "moznss database", 0);
|
|
|
|
+ } else {
|
|
|
|
+ return -1;
|
2012-10-31 11:50:15 +00:00
|
|
|
}
|
2012-09-14 14:14:43 +00:00
|
|
|
}
|
|
|
|
|