diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c
index 259b1d8..05b49dd 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_ssl_crl(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *crl)
|
| 313 | 323 | static int |
| 314 | 324 | ngx_http_ssl_verify_callback(int ok, X509_STORE_CTX *x509_store) |
| 315 | 325 | { |
| 316 | | #if (NGX_DEBUG) |
| 317 | | char *subject, *issuer; |
| 318 | | int err, depth; |
| 319 | | X509 *cert; |
| 320 | | X509_NAME *sname, *iname; |
| 321 | 326 | ngx_connection_t *c; |
| 322 | 327 | ngx_ssl_conn_t *ssl_conn; |
| 323 | 328 | |
| … |
… |
ngx_http_ssl_verify_callback(int ok, X509_STORE_CTX *x509_store)
|
| 326 | 331 | |
| 327 | 332 | c = ngx_ssl_get_connection(ssl_conn); |
| 328 | 333 | |
| | 334 | #if (NGX_DEBUG) |
| | 335 | char *subject, *issuer; |
| | 336 | int err, depth; |
| | 337 | X509 *cert; |
| | 338 | X509_NAME *sname, *iname; |
| | 339 | |
| 329 | 340 | cert = X509_STORE_CTX_get_current_cert(x509_store); |
| 330 | 341 | err = X509_STORE_CTX_get_error(x509_store); |
| 331 | 342 | depth = X509_STORE_CTX_get_error_depth(x509_store); |
| … |
… |
ngx_http_ssl_verify_callback(int ok, X509_STORE_CTX *x509_store)
|
| 350 | 361 | } |
| 351 | 362 | #endif |
| 352 | 363 | |
| | 364 | if (ok != 1) |
| | 365 | { |
| | 366 | ngx_ssl_error(NGX_LOG_EMERG, c->log, 0, "ngx_http_ssl_verify_callback failed"); |
| | 367 | c->ssl->verification_failed = 1; |
| | 368 | return 0; |
| | 369 | } |
| | 370 | |
| 353 | 371 | return 1; |
| 354 | 372 | } |
| 355 | 373 | |
| … |
… |
ngx_ssl_handshake(ngx_connection_t *c)
|
| 575 | 593 | |
| 576 | 594 | ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_do_handshake: %d", n); |
| 577 | 595 | |
| | 596 | if (c->ssl->verification_failed != NGX_OK) |
| | 597 | { |
| | 598 | return NGX_ERROR; |
| | 599 | } |
| | 600 | |
| 578 | 601 | if (n == 1) { |
| 579 | 602 | |
| 580 | 603 | if (ngx_handle_read_event(c->read, 0) != NGX_OK) { |
diff --git a/src/event/ngx_event_openssl.h b/src/event/ngx_event_openssl.h
index 33cab7b..b59baf9 100644
|
a
|
b
|
typedef struct {
|
| 46 | 46 | unsigned buffer:1; |
| 47 | 47 | unsigned no_wait_shutdown:1; |
| 48 | 48 | unsigned no_send_shutdown:1; |
| | 49 | |
| | 50 | ngx_int_t verification_failed; |
| 49 | 51 | } ngx_ssl_connection_t; |
| 50 | 52 | |
| 51 | 53 | |
| … |
… |
ngx_int_t ngx_ssl_init(ngx_log_t *log);
|
| 96 | 98 | ngx_int_t ngx_ssl_create(ngx_ssl_t *ssl, ngx_uint_t protocols, void *data); |
| 97 | 99 | ngx_int_t ngx_ssl_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, |
| 98 | 100 | ngx_str_t *cert, ngx_str_t *key); |
| | 101 | ngx_int_t ngx_ssl_set_verify_options(ngx_ssl_t *ssl, ngx_str_t *cert, |
| | 102 | ngx_int_t depth); |
| 99 | 103 | ngx_int_t ngx_ssl_client_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, |
| 100 | 104 | ngx_str_t *cert, ngx_int_t depth); |
| 101 | 105 | 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; |