diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c
index 259b1d8..078978b 100644
|
a
|
b
|
ngx_ssl_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert,
|
| 216 | 216 | return NGX_OK; |
| 217 | 217 | } |
| 218 | 218 | |
| 219 | | |
| 220 | 219 | ngx_int_t |
| 221 | | ngx_ssl_client_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert, |
| | 220 | ngx_ssl_set_verify_options(ngx_ssl_t *ssl, ngx_str_t *cert, |
| 222 | 221 | ngx_int_t depth) |
| 223 | 222 | { |
| 224 | | STACK_OF(X509_NAME) *list; |
| 225 | | |
| 226 | 223 | SSL_CTX_set_verify(ssl->ctx, SSL_VERIFY_PEER, ngx_http_ssl_verify_callback); |
| 227 | 224 | |
| 228 | 225 | SSL_CTX_set_verify_depth(ssl->ctx, depth); |
| … |
… |
ngx_ssl_client_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert,
|
| 231 | 228 | return NGX_OK; |
| 232 | 229 | } |
| 233 | 230 | |
| 234 | | if (ngx_conf_full_name(cf->cycle, cert, 1) != NGX_OK) { |
| 235 | | return NGX_ERROR; |
| 236 | | } |
| 237 | | |
| 238 | 231 | if (SSL_CTX_load_verify_locations(ssl->ctx, (char *) cert->data, NULL) |
| 239 | 232 | == 0) |
| 240 | 233 | { |
| … |
… |
ngx_ssl_client_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert,
|
| 244 | 237 | return NGX_ERROR; |
| 245 | 238 | } |
| 246 | 239 | |
| | 240 | return NGX_OK; |
| | 241 | } |
| | 242 | |
| | 243 | ngx_int_t |
| | 244 | ngx_ssl_client_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert, |
| | 245 | ngx_int_t depth) |
| | 246 | { |
| | 247 | STACK_OF(X509_NAME) *list; |
| | 248 | |
| | 249 | if (ngx_ssl_set_verify_options(ssl, cert, depth) != NGX_OK) { |
| | 250 | return NGX_ERROR; |
| | 251 | } |
| | 252 | |
| | 253 | if (ngx_conf_full_name(cf->cycle, cert, 1) != NGX_OK) { |
| | 254 | return NGX_ERROR; |
| | 255 | } |
| | 256 | |
| 247 | 257 | list = SSL_load_client_CA_file((char *) cert->data); |
| 248 | 258 | |
| 249 | 259 | if (list == NULL) { |
| … |
… |
ngx_http_ssl_verify_callback(int ok, X509_STORE_CTX *x509_store)
|
| 350 | 360 | } |
| 351 | 361 | #endif |
| 352 | 362 | |
| 353 | | return 1; |
| | 363 | return ok; |
| 354 | 364 | } |
| 355 | 365 | |
| 356 | 366 | |
| … |
… |
ngx_ssl_set_session(ngx_connection_t *c, ngx_ssl_session_t *session)
|
| 566 | 576 | ngx_int_t |
| 567 | 577 | ngx_ssl_handshake(ngx_connection_t *c) |
| 568 | 578 | { |
| 569 | | int n, sslerr; |
| | 579 | int n, sslerr, verify_err, verify_mode; |
| 570 | 580 | ngx_err_t err; |
| 571 | 581 | |
| 572 | 582 | ngx_ssl_clear_error(c->log); |
| … |
… |
ngx_ssl_handshake(ngx_connection_t *c)
|
| 577 | 587 | |
| 578 | 588 | if (n == 1) { |
| 579 | 589 | |
| | 590 | if (SSL_get_peer_certificate(c->ssl->connection) != NULL) |
| | 591 | { |
| | 592 | ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_peer_certificate is present"); |
| | 593 | } |
| | 594 | |
| | 595 | verify_mode = SSL_get_verify_mode(c->ssl->connection); |
| | 596 | ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_verify_mode: %d", verify_mode); |
| | 597 | |
| | 598 | verify_err = SSL_get_verify_result(c->ssl->connection); |
| | 599 | ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_verify_result: %d", verify_err); |
| | 600 | if (verify_err != X509_V_OK) |
| | 601 | { |
| | 602 | ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_get_verify_result() failed"); |
| | 603 | return NGX_ERROR; |
| | 604 | } |
| | 605 | |
| 580 | 606 | if (ngx_handle_read_event(c->read, 0) != NGX_OK) { |
| 581 | 607 | return NGX_ERROR; |
| 582 | 608 | } |
| … |
… |
ngx_openssl_exit(ngx_cycle_t *cycle)
|
| 2354 | 2380 | EVP_cleanup(); |
| 2355 | 2381 | ENGINE_cleanup(); |
| 2356 | 2382 | } |
| | 2383 | |
diff --git a/src/event/ngx_event_openssl.h b/src/event/ngx_event_openssl.h
index 33cab7b..0aac3e8 100644
|
a
|
b
|
ngx_int_t ngx_ssl_init(ngx_log_t *log);
|
| 96 | 96 | ngx_int_t ngx_ssl_create(ngx_ssl_t *ssl, ngx_uint_t protocols, void *data); |
| 97 | 97 | ngx_int_t ngx_ssl_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, |
| 98 | 98 | ngx_str_t *cert, ngx_str_t *key); |
| | 99 | ngx_int_t ngx_ssl_set_verify_options(ngx_ssl_t *ssl, ngx_str_t *cert, |
| | 100 | ngx_int_t depth); |
| 99 | 101 | ngx_int_t ngx_ssl_client_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, |
| 100 | 102 | ngx_str_t *cert, ngx_int_t depth); |
| 101 | 103 | ngx_int_t ngx_ssl_crl(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *crl); |
diff --git a/src/http/modules/ngx_http_proxy_module.c b/src/http/modules/ngx_http_proxy_module.c
index 902cfb8..834301e 100644
|
a
|
b
|
static ngx_command_t ngx_http_proxy_commands[] = {
|
| 440 | 440 | NGX_HTTP_LOC_CONF_OFFSET, |
| 441 | 441 | offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_session_reuse), |
| 442 | 442 | NULL }, |
| | 443 | |
| | 444 | { ngx_string("proxy_ssl_verify_peer"), |
| | 445 | NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
| | 446 | ngx_conf_set_flag_slot, |
| | 447 | NGX_HTTP_LOC_CONF_OFFSET, |
| | 448 | offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_verify_peer), |
| | 449 | NULL }, |
| | 450 | |
| | 451 | { ngx_string("proxy_ssl_verify_depth"), |
| | 452 | NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
| | 453 | ngx_conf_set_num_slot, |
| | 454 | NGX_HTTP_LOC_CONF_OFFSET, |
| | 455 | offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_verify_depth), |
| | 456 | NULL }, |
| 443 | 457 | |
| | 458 | { ngx_string("proxy_ssl_ca_certificate"), |
| | 459 | NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
| | 460 | ngx_conf_set_str_slot, |
| | 461 | NGX_HTTP_LOC_CONF_OFFSET, |
| | 462 | offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_ca_certificate), |
| | 463 | NULL }, |
| 444 | 464 | #endif |
| 445 | 465 | |
| 446 | 466 | ngx_null_command |
| … |
… |
ngx_http_proxy_create_loc_conf(ngx_conf_t *cf)
|
| 1697 | 1717 | conf->upstream.intercept_errors = NGX_CONF_UNSET; |
| 1698 | 1718 | #if (NGX_HTTP_SSL) |
| 1699 | 1719 | conf->upstream.ssl_session_reuse = NGX_CONF_UNSET; |
| | 1720 | conf->upstream.ssl_verify_peer = NGX_CONF_UNSET; |
| | 1721 | conf->upstream.ssl_verify_depth = NGX_CONF_UNSET_UINT; |
| 1700 | 1722 | #endif |
| 1701 | 1723 | |
| 1702 | 1724 | /* "proxy_cyclic_temp_file" is disabled */ |
| … |
… |
ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
|
| 1955 | 1977 | #if (NGX_HTTP_SSL) |
| 1956 | 1978 | ngx_conf_merge_value(conf->upstream.ssl_session_reuse, |
| 1957 | 1979 | prev->upstream.ssl_session_reuse, 1); |
| | 1980 | ngx_conf_merge_value(conf->upstream.ssl_verify_peer, |
| | 1981 | prev->upstream.ssl_verify_peer, 0); |
| | 1982 | ngx_conf_merge_uint_value(conf->upstream.ssl_verify_depth, |
| | 1983 | prev->upstream.ssl_verify_depth, 1); |
| | 1984 | ngx_conf_merge_str_value(conf->upstream.ssl_ca_certificate, |
| | 1985 | prev->upstream.ssl_ca_certificate, ""); |
| | 1986 | |
| | 1987 | if (conf->upstream.ssl_verify_peer) { |
| | 1988 | if (conf->upstream.ssl_ca_certificate.len == 0) { |
| | 1989 | ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
| | 1990 | "no \"proxy_ssl_ca_certificate\" is defined for " |
| | 1991 | "the \"proxy_ssl_verify_peer\" directive"); |
| | 1992 | |
| | 1993 | return NGX_CONF_ERROR; |
| | 1994 | } |
| | 1995 | } |
| 1958 | 1996 | #endif |
| 1959 | 1997 | |
| 1960 | 1998 | ngx_conf_merge_value(conf->redirect, prev->redirect, 1); |
diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c
index 29432dc..474cf0d 100644
|
a
|
b
|
ngx_http_upstream_ssl_init_connection(ngx_http_request_t *r,
|
| 1210 | 1210 | { |
| 1211 | 1211 | ngx_int_t rc; |
| 1212 | 1212 | |
| | 1213 | if (ngx_ssl_set_verify_options(u->conf->ssl, |
| | 1214 | &u->conf->ssl_ca_certificate, u->conf->ssl_verify_depth) |
| | 1215 | != NGX_OK) |
| | 1216 | { |
| | 1217 | ngx_http_upstream_finalize_request(r, u, |
| | 1218 | NGX_HTTP_INTERNAL_SERVER_ERROR); |
| | 1219 | return; |
| | 1220 | } |
| | 1221 | |
| 1213 | 1222 | if (ngx_ssl_create_connection(u->conf->ssl, c, |
| 1214 | 1223 | NGX_SSL_BUFFER|NGX_SSL_CLIENT) |
| 1215 | 1224 | != NGX_OK) |
| … |
… |
ngx_http_upstream_init_main_conf(ngx_conf_t *cf, void *conf)
|
| 4527 | 4536 | |
| 4528 | 4537 | return NGX_CONF_OK; |
| 4529 | 4538 | } |
| | 4539 | |
diff --git a/src/http/ngx_http_upstream.h b/src/http/ngx_http_upstream.h
index fa848c0..cc71ba9 100644
|
a
|
b
|
typedef struct {
|
| 177 | 177 | #if (NGX_HTTP_SSL) |
| 178 | 178 | ngx_ssl_t *ssl; |
| 179 | 179 | ngx_flag_t ssl_session_reuse; |
| | 180 | ngx_flag_t ssl_verify_peer; |
| | 181 | ngx_uint_t ssl_verify_depth; |
| | 182 | ngx_str_t ssl_ca_certificate; |
| 180 | 183 | #endif |
| 181 | 184 | |
| 182 | 185 | ngx_str_t module; |