Commit 339372a78f553e74cd8a94b38e0bd61941a515aa

Authored by Perry Werneck
1 parent d908bfc4
Exists in master and in 2 other branches develop, macos

Fixing CRL download.

src/network_modules/openssl/crl.c
@@ -27,7 +27,7 @@ @@ -27,7 +27,7 @@
27 * 27 *
28 */ 28 */
29 29
30 -/// @brief Get CRL infro from X509 cert. 30 +/// @brief Get CRL info from X509 cert.
31 /// 31 ///
32 /// References: 32 /// References:
33 /// 33 ///
@@ -35,6 +35,7 @@ @@ -35,6 +35,7 @@
35 35
36 36
37 #include "private.h" 37 #include "private.h"
  38 +#include <utilc.h>
38 39
39 /*--[ Implement ]------------------------------------------------------------------------------------*/ 40 /*--[ Implement ]------------------------------------------------------------------------------------*/
40 41
@@ -79,7 +80,13 @@ LIB3270_STRING_ARRAY * lib3270_openssl_get_crls_from_peer(H3270 *hSession, X509 @@ -79,7 +80,13 @@ LIB3270_STRING_ARRAY * lib3270_openssl_get_crls_from_peer(H3270 *hSession, X509
79 #endif // OpenSSL 1.1.0+ 80 #endif // OpenSSL 1.1.0+
80 81
81 if(data && length > 0) 82 if(data && length > 0)
82 - lib3270_string_array_append_with_length(uris,(char *) data, (size_t) length); 83 + {
  84 + lib3270_autoptr(char) uri = lib3270_malloc( ((size_t) length) + 1);
  85 + strncpy(uri,(char *) data, (size_t) length);
  86 +
  87 + lib3270_autoptr(char) unescaped = lib3270_unescape(uri);
  88 + lib3270_string_array_append(uris,unescaped);
  89 + }
83 90
84 } 91 }
85 92
src/network_modules/openssl/start.c
@@ -104,25 +104,26 @@ @@ -104,25 +104,26 @@
104 104
105 if(X509_STORE_add_crl(store, x509_crl)) { 105 if(X509_STORE_add_crl(store, x509_crl)) {
106 trace_ssl(hSession,"CRL was added to context cert store\n"); 106 trace_ssl(hSession,"CRL was added to context cert store\n");
107 - } else {  
108 - trace_ssl(hSession,"CRL was not added to context cert store\n"); 107 + return 0;
109 } 108 }
110 109
111 - return 0; 110 + trace_ssl(hSession,"CRL was not added to context cert store\n");
  111 +
  112 + return -1;
112 113
113 } 114 }
114 115
115 - static void download_crl_from_peer(H3270 *hSession, SSL_CTX * ctx_context, LIB3270_NET_CONTEXT * context, X509 *peer) { 116 + static int download_crl_from_peer(H3270 *hSession, SSL_CTX * ctx_context, LIB3270_NET_CONTEXT * context, X509 *peer) {
116 117
117 debug("%s peer=%p",__FUNCTION__,(void *) peer); 118 debug("%s peer=%p",__FUNCTION__,(void *) peer);
118 119
119 if(!peer) 120 if(!peer)
120 - return; 121 + return -1;
121 122
122 lib3270_autoptr(LIB3270_STRING_ARRAY) uris = lib3270_openssl_get_crls_from_peer(hSession, peer); 123 lib3270_autoptr(LIB3270_STRING_ARRAY) uris = lib3270_openssl_get_crls_from_peer(hSession, peer);
123 if(!uris) { 124 if(!uris) {
124 trace_ssl(hSession,"Can't get distpoints from peer certificate\n"); 125 trace_ssl(hSession,"Can't get distpoints from peer certificate\n");
125 - return; 126 + return -1;
126 } 127 }
127 128
128 size_t ix; 129 size_t ix;
@@ -135,11 +136,11 @@ @@ -135,11 +136,11 @@
135 136
136 if(!import_crl(hSession,ctx_context,context,uris->str[ix])) { 137 if(!import_crl(hSession,ctx_context,context,uris->str[ix])) {
137 trace_ssl(hSession,"Got CRL from %s\n",uris->str[ix]); 138 trace_ssl(hSession,"Got CRL from %s\n",uris->str[ix]);
138 - return; 139 + return 0;
139 } 140 }
140 141
141 } 142 }
142 - return; 143 + return -1;
143 144
144 } 145 }
145 146
@@ -153,12 +154,9 @@ @@ -153,12 +154,9 @@
153 if(strncasecmp(prefer,uris->str[ix],length)) 154 if(strncasecmp(prefer,uris->str[ix],length))
154 continue; 155 continue;
155 156
156 - lib3270_autoptr(char) url = lib3270_unescape(uris->str[ix]);  
157 - debug("Trying %s",url);  
158 -  
159 - if(!import_crl(hSession,ctx_context,context,url)) {  
160 - trace_ssl(hSession,"Got CRL from %s\n",url);  
161 - return; 157 + if(!import_crl(hSession,ctx_context,context,uris->str[ix])) {
  158 + trace_ssl(hSession,"Got CRL from %s\n",uris->str[ix]);
  159 + return 0;
162 } 160 }
163 161
164 } 162 }
@@ -171,13 +169,34 @@ @@ -171,13 +169,34 @@
171 169
172 if(!import_crl(hSession,ctx_context,context,uris->str[ix])) { 170 if(!import_crl(hSession,ctx_context,context,uris->str[ix])) {
173 trace_ssl(hSession,"Got CRL from %s\n",uris->str[ix]); 171 trace_ssl(hSession,"Got CRL from %s\n",uris->str[ix]);
174 - return; 172 + return 0;
175 } 173 }
176 174
177 } 175 }
178 176
  177 + return -1;
  178 +
179 } 179 }
180 180
  181 +int x509_store_ctx_error_callback(int ok, X509_STORE_CTX GNUC_UNUSED(*ctx))
  182 +{
  183 + debug("%s(%d)",__FUNCTION__,ok);
  184 +
  185 +/*
  186 + 55 {
  187 + 56 if (!ok) {
  188 + 57 Category::getInstance("OpenSSL").error(
  189 + 58 "path validation failure at depth(%d): %s",
  190 + 59 X509_STORE_CTX_get_error_depth(ctx),
  191 + 60 X509_verify_cert_error_string(X509_STORE_CTX_get_error(ctx))
  192 + 61 );
  193 + 62 }
  194 + 63 return ok;
  195 + 64 }
  196 +*/
  197 + return ok;
  198 +}
  199 +
181 int openssl_network_start_tls(H3270 *hSession) { 200 int openssl_network_start_tls(H3270 *hSession) {
182 201
183 SSL_CTX * ctx_context = (SSL_CTX *) lib3270_openssl_get_context(hSession); 202 SSL_CTX * ctx_context = (SSL_CTX *) lib3270_openssl_get_context(hSession);
@@ -202,7 +221,8 @@ @@ -202,7 +221,8 @@
202 221
203 SSL_set_ex_data(context->con,lib3270_openssl_get_ex_index(hSession),(char *) hSession); 222 SSL_set_ex_data(context->con,lib3270_openssl_get_ex_index(hSession),(char *) hSession);
204 // SSL_set_verify(context->con, SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL); 223 // SSL_set_verify(context->con, SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);
205 - SSL_set_verify(context->con, 0, NULL); 224 +// SSL_set_verify(context->con, SSL_VERIFY_PEER, NULL);
  225 + SSL_set_verify(context->con, SSL_VERIFY_NONE, NULL);
206 226
207 if(SSL_set_fd(context->con, context->sock) != 1) 227 if(SSL_set_fd(context->con, context->sock) != 1)
208 { 228 {
@@ -298,13 +318,40 @@ @@ -298,13 +318,40 @@
298 318
299 // CRL download is enabled and verification has failed; look for CRL file. 319 // CRL download is enabled and verification has failed; look for CRL file.
300 320
  321 +
301 trace_ssl(hSession,"CRL Validation has failed, requesting CRL download\n"); 322 trace_ssl(hSession,"CRL Validation has failed, requesting CRL download\n");
302 set_ssl_state(hSession,LIB3270_SSL_VERIFYING); 323 set_ssl_state(hSession,LIB3270_SSL_VERIFYING);
303 324
  325 + int rc_download = -1;
  326 +
304 if(context->crl.url) { 327 if(context->crl.url) {
305 - import_crl(hSession, ctx_context,context,context->crl.url); 328 + rc_download = import_crl(hSession, ctx_context,context,context->crl.url);
306 } else { 329 } else {
307 - download_crl_from_peer(hSession, ctx_context, context, peer); 330 + rc_download = download_crl_from_peer(hSession, ctx_context, context, peer);
  331 + }
  332 +
  333 + debug("Download rc=%d",rc_download);
  334 +
  335 + if(!rc_download)
  336 + {
  337 + // Got CRL, verify it!
  338 + // Reference: https://stackoverflow.com/questions/10510850/how-to-verify-the-certificate-for-the-ongoing-ssl-session
  339 +
  340 + X509_STORE_CTX *csc = X509_STORE_CTX_new();
  341 + X509_STORE_CTX_set_verify_cb(csc, x509_store_ctx_error_callback);
  342 + X509_STORE_CTX_init(csc, SSL_CTX_get_cert_store(ctx_context), peer, NULL);
  343 +
  344 + if(X509_verify_cert(csc) != 1)
  345 + rv = X509_STORE_CTX_get_error(csc);
  346 + else
  347 + rv = X509_V_OK;
  348 +
  349 + trace_ssl(hSession, "X509_verify_cert error code was %d\n", rv);
  350 +
  351 + SSL_set_verify_result(context->con, rv);
  352 +
  353 + X509_STORE_CTX_free(csc);
  354 +
308 } 355 }
309 356
310 } 357 }
@@ -316,6 +363,7 @@ @@ -316,6 +363,7 @@
316 363
317 // Get validation message. 364 // Get validation message.
318 hSession->ssl.message = lib3270_openssl_message_from_id(verify_result); 365 hSession->ssl.message = lib3270_openssl_message_from_id(verify_result);
  366 + debug("Verify message: %s",hSession->ssl.message->summary);
319 367
320 // Trace cypher 368 // Trace cypher
321 if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE)) 369 if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE))
@@ -334,7 +382,7 @@ @@ -334,7 +382,7 @@
334 382
335 // Check results. 383 // Check results.
336 if(hSession->ssl.message) 384 if(hSession->ssl.message)
337 - trace_ssl(hSession,"%s",hSession->ssl.message->summary); 385 + trace_ssl(hSession,"%s\n",hSession->ssl.message->summary);
338 else 386 else
339 trace_ssl(hSession,"TLS/SSL verify result was %ld\n", verify_result); 387 trace_ssl(hSession,"TLS/SSL verify result was %ld\n", verify_result);
340 388