1 |
MozNSS: load certificates from certdb, fallback to PEM |
2 |
|
3 |
If TLS_CACERT pointed to a PEM file and TLS_CACERTDIR was set to NSS |
4 |
certificate database, the backend assumed that the certificate is always |
5 |
located in the certificate database. This assumption might be wrong. |
6 |
|
7 |
This patch makes the library to try to load the certificate from NSS |
8 |
database and fallback to PEM file if unsuccessfull. |
9 |
|
10 |
Author: Jan Vcelak <jvcelak@redhat.com> |
11 |
Upstream ITS: #7389 |
12 |
Resolves: #857455 |
13 |
|
14 |
diff --git a/libraries/libldap/tls_m.c b/libraries/libldap/tls_m.c |
15 |
index 6847bea..8339391 100644 |
16 |
--- a/libraries/libldap/tls_m.c |
17 |
+++ b/libraries/libldap/tls_m.c |
18 |
@@ -1412,7 +1412,7 @@ tlsm_ctx_load_private_key( tlsm_ctx *ctx ) |
19 |
/* prefer unlocked key, then key from opened certdb, then any other */ |
20 |
if ( unlocked_key ) |
21 |
ctx->tc_private_key = unlocked_key; |
22 |
- else if ( ctx->tc_certdb_slot ) |
23 |
+ else if ( ctx->tc_certdb_slot && !ctx->tc_using_pem ) |
24 |
ctx->tc_private_key = PK11_FindKeyByDERCert( ctx->tc_certdb_slot, ctx->tc_certificate, pin_arg ); |
25 |
else |
26 |
ctx->tc_private_key = PK11_FindKeyByAnyCert( ctx->tc_certificate, pin_arg ); |
27 |
@@ -1909,8 +1909,6 @@ tlsm_deferred_init( void *arg ) |
28 |
} |
29 |
return -1; |
30 |
} |
31 |
- |
32 |
- ctx->tc_using_pem = PR_TRUE; |
33 |
} |
34 |
|
35 |
NSS_SetDomesticPolicy(); |
36 |
@@ -2363,15 +2361,9 @@ tlsm_deferred_ctx_init( void *arg ) |
37 |
|
38 |
/* set up our cert and key, if any */ |
39 |
if ( lt->lt_certfile ) { |
40 |
- /* if using the PEM module, load the PEM file specified by lt_certfile */ |
41 |
- /* otherwise, assume this is the name of a cert already in the db */ |
42 |
- if ( ctx->tc_using_pem ) { |
43 |
- /* this sets ctx->tc_certificate to the correct value */ |
44 |
- int rc = tlsm_add_cert_from_file( ctx, lt->lt_certfile, PR_FALSE ); |
45 |
- if ( rc ) { |
46 |
- return rc; |
47 |
- } |
48 |
- } else { |
49 |
+ |
50 |
+ /* first search in certdb (lt_certfile is nickname) */ |
51 |
+ if ( ctx->tc_certdb ) { |
52 |
char *tmp_certname; |
53 |
|
54 |
if ( tlsm_is_tokenname_certnick( lt->lt_certfile )) { |
55 |
@@ -2391,8 +2383,31 @@ tlsm_deferred_ctx_init( void *arg ) |
56 |
Debug( LDAP_DEBUG_ANY, |
57 |
"TLS: error: the certificate '%s' could not be found in the database - error %d:%s.\n", |
58 |
lt->lt_certfile, errcode, PR_ErrorToString( errcode, PR_LANGUAGE_I_DEFAULT ) ); |
59 |
+ } |
60 |
+ } |
61 |
+ |
62 |
+ /* fallback to PEM module (lt_certfile is filename) */ |
63 |
+ if ( !ctx->tc_certificate ) { |
64 |
+ if ( !pem_module && tlsm_init_pem_module() ) { |
65 |
+ int pem_errcode = PORT_GetError(); |
66 |
+ Debug( LDAP_DEBUG_ANY, |
67 |
+ "TLS: fallback to PEM impossible, module cannot be loaded - error %d:%s.\n", |
68 |
+ pem_errcode, PR_ErrorToString( pem_errcode, PR_LANGUAGE_I_DEFAULT ), 0 ); |
69 |
return -1; |
70 |
} |
71 |
+ |
72 |
+ /* this sets ctx->tc_certificate to the correct value */ |
73 |
+ if ( !tlsm_add_cert_from_file( ctx, lt->lt_certfile, PR_FALSE ) ) { |
74 |
+ ctx->tc_using_pem = PR_TRUE; |
75 |
+ } |
76 |
+ } |
77 |
+ |
78 |
+ if ( ctx->tc_certificate ) { |
79 |
+ Debug( LDAP_DEBUG_ANY, |
80 |
+ "TLS: certificate '%s' successfully loaded from %s.\n", lt->lt_certfile, |
81 |
+ ctx->tc_using_pem ? "PEM file" : "moznss database", 0); |
82 |
+ } else { |
83 |
+ return -1; |
84 |
} |
85 |
} |
86 |
|