mirror of
https://github.com/nginx/nginx.git
synced 2025-08-06 14:56:15 +08:00
Merged with the default branch.
This commit is contained in:
commit
38091071a8
1
.hgtags
1
.hgtags
@ -449,3 +449,4 @@ e56295fe0ea76bf53b06bffa77a2d3a9a335cb8c release-1.17.7
|
|||||||
fdacd273711ddf20f778c1fb91529ab53979a454 release-1.17.8
|
fdacd273711ddf20f778c1fb91529ab53979a454 release-1.17.8
|
||||||
5e8d52bca714d4b85284ddb649d1ba4a3ca978a8 release-1.17.9
|
5e8d52bca714d4b85284ddb649d1ba4a3ca978a8 release-1.17.9
|
||||||
c44970de01474f6f3e01b0adea85ec1d03e3a5f2 release-1.17.10
|
c44970de01474f6f3e01b0adea85ec1d03e3a5f2 release-1.17.10
|
||||||
|
cbe6ba650211541310618849168631ce0b788f35 release-1.19.0
|
||||||
|
@ -5,6 +5,51 @@
|
|||||||
<change_log title="nginx">
|
<change_log title="nginx">
|
||||||
|
|
||||||
|
|
||||||
|
<changes ver="1.19.0" date="2020-05-26">
|
||||||
|
|
||||||
|
<change type="feature">
|
||||||
|
<para lang="ru">
|
||||||
|
проверка клиентских сертификатов с помощью OCSP.
|
||||||
|
</para>
|
||||||
|
<para lang="en">
|
||||||
|
client certificate validation with OCSP.
|
||||||
|
</para>
|
||||||
|
</change>
|
||||||
|
|
||||||
|
<change type="bugfix">
|
||||||
|
<para lang="ru">
|
||||||
|
при работе с gRPC-бэкендами
|
||||||
|
могли возникать ошибки "upstream sent frame for closed stream".
|
||||||
|
</para>
|
||||||
|
<para lang="en">
|
||||||
|
"upstream sent frame for closed stream" errors might occur
|
||||||
|
when working with gRPC backends.
|
||||||
|
</para>
|
||||||
|
</change>
|
||||||
|
|
||||||
|
<change type="bugfix">
|
||||||
|
<para lang="ru">
|
||||||
|
OCSP stapling мог не работать,
|
||||||
|
если не была указана директива resolver.
|
||||||
|
</para>
|
||||||
|
<para lang="en">
|
||||||
|
OCSP stapling might not work
|
||||||
|
if the "resolver" directive was not specified.
|
||||||
|
</para>
|
||||||
|
</change>
|
||||||
|
|
||||||
|
<change type="bugfix">
|
||||||
|
<para lang="ru">
|
||||||
|
соединения с некорректным HTTP/2 preface не логгировались.
|
||||||
|
</para>
|
||||||
|
<para lang="en">
|
||||||
|
connections with incorrect HTTP/2 preface were not logged.
|
||||||
|
</para>
|
||||||
|
</change>
|
||||||
|
|
||||||
|
</changes>
|
||||||
|
|
||||||
|
|
||||||
<changes ver="1.17.10" date="2020-04-14">
|
<changes ver="1.17.10" date="2020-04-14">
|
||||||
|
|
||||||
<change type="feature">
|
<change type="feature">
|
||||||
|
@ -6,7 +6,7 @@ TEMP = tmp
|
|||||||
|
|
||||||
CC = cl
|
CC = cl
|
||||||
OBJS = objs.msvc8
|
OBJS = objs.msvc8
|
||||||
OPENSSL = openssl-1.1.1f
|
OPENSSL = openssl-1.1.1g
|
||||||
ZLIB = zlib-1.2.11
|
ZLIB = zlib-1.2.11
|
||||||
PCRE = pcre-8.44
|
PCRE = pcre-8.44
|
||||||
|
|
||||||
|
@ -9,8 +9,8 @@
|
|||||||
#define _NGINX_H_INCLUDED_
|
#define _NGINX_H_INCLUDED_
|
||||||
|
|
||||||
|
|
||||||
#define nginx_version 1017010
|
#define nginx_version 1019000
|
||||||
#define NGINX_VERSION "1.17.10"
|
#define NGINX_VERSION "1.19.0"
|
||||||
#define NGINX_VER "nginx/" NGINX_VERSION
|
#define NGINX_VER "nginx/" NGINX_VERSION
|
||||||
|
|
||||||
#ifdef NGX_BUILD
|
#ifdef NGX_BUILD
|
||||||
|
@ -130,6 +130,7 @@ int ngx_ssl_connection_index;
|
|||||||
int ngx_ssl_server_conf_index;
|
int ngx_ssl_server_conf_index;
|
||||||
int ngx_ssl_session_cache_index;
|
int ngx_ssl_session_cache_index;
|
||||||
int ngx_ssl_session_ticket_keys_index;
|
int ngx_ssl_session_ticket_keys_index;
|
||||||
|
int ngx_ssl_ocsp_index;
|
||||||
int ngx_ssl_certificate_index;
|
int ngx_ssl_certificate_index;
|
||||||
int ngx_ssl_next_certificate_index;
|
int ngx_ssl_next_certificate_index;
|
||||||
int ngx_ssl_certificate_name_index;
|
int ngx_ssl_certificate_name_index;
|
||||||
@ -213,6 +214,13 @@ ngx_ssl_init(ngx_log_t *log)
|
|||||||
return NGX_ERROR;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngx_ssl_ocsp_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL, NULL);
|
||||||
|
if (ngx_ssl_ocsp_index == -1) {
|
||||||
|
ngx_ssl_error(NGX_LOG_ALERT, log, 0,
|
||||||
|
"SSL_CTX_get_ex_new_index() failed");
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
ngx_ssl_certificate_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL,
|
ngx_ssl_certificate_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL,
|
||||||
NULL);
|
NULL);
|
||||||
if (ngx_ssl_certificate_index == -1) {
|
if (ngx_ssl_certificate_index == -1) {
|
||||||
@ -1594,6 +1602,7 @@ ngx_ssl_handshake(ngx_connection_t *c)
|
|||||||
{
|
{
|
||||||
int n, sslerr;
|
int n, sslerr;
|
||||||
ngx_err_t err;
|
ngx_err_t err;
|
||||||
|
ngx_int_t rc;
|
||||||
|
|
||||||
#ifdef SSL_READ_EARLY_DATA_SUCCESS
|
#ifdef SSL_READ_EARLY_DATA_SUCCESS
|
||||||
if (c->ssl->try_early_data) {
|
if (c->ssl->try_early_data) {
|
||||||
@ -1601,6 +1610,10 @@ ngx_ssl_handshake(ngx_connection_t *c)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (c->ssl->in_ocsp) {
|
||||||
|
return ngx_ssl_ocsp_validate(c);
|
||||||
|
}
|
||||||
|
|
||||||
ngx_ssl_clear_error(c->log);
|
ngx_ssl_clear_error(c->log);
|
||||||
|
|
||||||
n = SSL_do_handshake(c->ssl->connection);
|
n = SSL_do_handshake(c->ssl->connection);
|
||||||
@ -1621,8 +1634,6 @@ ngx_ssl_handshake(ngx_connection_t *c)
|
|||||||
ngx_ssl_handshake_log(c);
|
ngx_ssl_handshake_log(c);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
c->ssl->handshaked = 1;
|
|
||||||
|
|
||||||
c->recv = ngx_ssl_recv;
|
c->recv = ngx_ssl_recv;
|
||||||
c->send = ngx_ssl_write;
|
c->send = ngx_ssl_write;
|
||||||
c->recv_chain = ngx_ssl_recv_chain;
|
c->recv_chain = ngx_ssl_recv_chain;
|
||||||
@ -1641,6 +1652,20 @@ ngx_ssl_handshake(ngx_connection_t *c)
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
rc = ngx_ssl_ocsp_validate(c);
|
||||||
|
|
||||||
|
if (rc == NGX_ERROR) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rc == NGX_AGAIN) {
|
||||||
|
c->read->handler = ngx_ssl_handshake_handler;
|
||||||
|
c->write->handler = ngx_ssl_handshake_handler;
|
||||||
|
return NGX_AGAIN;
|
||||||
|
}
|
||||||
|
|
||||||
|
c->ssl->handshaked = 1;
|
||||||
|
|
||||||
return NGX_OK;
|
return NGX_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1710,6 +1735,7 @@ ngx_ssl_try_early_data(ngx_connection_t *c)
|
|||||||
u_char buf;
|
u_char buf;
|
||||||
size_t readbytes;
|
size_t readbytes;
|
||||||
ngx_err_t err;
|
ngx_err_t err;
|
||||||
|
ngx_int_t rc;
|
||||||
|
|
||||||
ngx_ssl_clear_error(c->log);
|
ngx_ssl_clear_error(c->log);
|
||||||
|
|
||||||
@ -1744,7 +1770,6 @@ ngx_ssl_try_early_data(ngx_connection_t *c)
|
|||||||
c->ssl->early_buf = buf;
|
c->ssl->early_buf = buf;
|
||||||
c->ssl->early_preread = 1;
|
c->ssl->early_preread = 1;
|
||||||
|
|
||||||
c->ssl->handshaked = 1;
|
|
||||||
c->ssl->in_early = 1;
|
c->ssl->in_early = 1;
|
||||||
|
|
||||||
c->recv = ngx_ssl_recv;
|
c->recv = ngx_ssl_recv;
|
||||||
@ -1752,6 +1777,20 @@ ngx_ssl_try_early_data(ngx_connection_t *c)
|
|||||||
c->recv_chain = ngx_ssl_recv_chain;
|
c->recv_chain = ngx_ssl_recv_chain;
|
||||||
c->send_chain = ngx_ssl_send_chain;
|
c->send_chain = ngx_ssl_send_chain;
|
||||||
|
|
||||||
|
rc = ngx_ssl_ocsp_validate(c);
|
||||||
|
|
||||||
|
if (rc == NGX_ERROR) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rc == NGX_AGAIN) {
|
||||||
|
c->read->handler = ngx_ssl_handshake_handler;
|
||||||
|
c->write->handler = ngx_ssl_handshake_handler;
|
||||||
|
return NGX_AGAIN;
|
||||||
|
}
|
||||||
|
|
||||||
|
c->ssl->handshaked = 1;
|
||||||
|
|
||||||
return NGX_OK;
|
return NGX_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2740,6 +2779,8 @@ ngx_ssl_shutdown(ngx_connection_t *c)
|
|||||||
return NGX_OK;
|
return NGX_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngx_ssl_ocsp_cleanup(c);
|
||||||
|
|
||||||
if (SSL_in_init(c->ssl->connection)) {
|
if (SSL_in_init(c->ssl->connection)) {
|
||||||
/*
|
/*
|
||||||
* OpenSSL 1.0.2f complains if SSL_shutdown() is called during
|
* OpenSSL 1.0.2f complains if SSL_shutdown() is called during
|
||||||
@ -4899,11 +4940,14 @@ ngx_ssl_get_client_verify(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)
|
|||||||
rc = SSL_get_verify_result(c->ssl->connection);
|
rc = SSL_get_verify_result(c->ssl->connection);
|
||||||
|
|
||||||
if (rc == X509_V_OK) {
|
if (rc == X509_V_OK) {
|
||||||
ngx_str_set(s, "SUCCESS");
|
if (ngx_ssl_ocsp_get_status(c, &str) == NGX_OK) {
|
||||||
return NGX_OK;
|
ngx_str_set(s, "SUCCESS");
|
||||||
}
|
return NGX_OK;
|
||||||
|
}
|
||||||
|
|
||||||
str = X509_verify_cert_error_string(rc);
|
} else {
|
||||||
|
str = X509_verify_cert_error_string(rc);
|
||||||
|
}
|
||||||
|
|
||||||
s->data = ngx_pnalloc(pool, sizeof("FAILED:") - 1 + ngx_strlen(str));
|
s->data = ngx_pnalloc(pool, sizeof("FAILED:") - 1 + ngx_strlen(str));
|
||||||
if (s->data == NULL) {
|
if (s->data == NULL) {
|
||||||
|
@ -71,6 +71,9 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct ngx_ssl_ocsp_s ngx_ssl_ocsp_t;
|
||||||
|
|
||||||
|
|
||||||
struct ngx_ssl_s {
|
struct ngx_ssl_s {
|
||||||
SSL_CTX *ctx;
|
SSL_CTX *ctx;
|
||||||
ngx_log_t *log;
|
ngx_log_t *log;
|
||||||
@ -94,6 +97,8 @@ struct ngx_ssl_connection_s {
|
|||||||
ngx_event_handler_pt saved_read_handler;
|
ngx_event_handler_pt saved_read_handler;
|
||||||
ngx_event_handler_pt saved_write_handler;
|
ngx_event_handler_pt saved_write_handler;
|
||||||
|
|
||||||
|
ngx_ssl_ocsp_t *ocsp;
|
||||||
|
|
||||||
u_char early_buf;
|
u_char early_buf;
|
||||||
|
|
||||||
unsigned handshaked:1;
|
unsigned handshaked:1;
|
||||||
@ -104,6 +109,7 @@ struct ngx_ssl_connection_s {
|
|||||||
unsigned handshake_buffer_set:1;
|
unsigned handshake_buffer_set:1;
|
||||||
unsigned try_early_data:1;
|
unsigned try_early_data:1;
|
||||||
unsigned in_early:1;
|
unsigned in_early:1;
|
||||||
|
unsigned in_ocsp:1;
|
||||||
unsigned early_preread:1;
|
unsigned early_preread:1;
|
||||||
unsigned write_blocked:1;
|
unsigned write_blocked:1;
|
||||||
};
|
};
|
||||||
@ -187,6 +193,14 @@ ngx_int_t ngx_ssl_stapling(ngx_conf_t *cf, ngx_ssl_t *ssl,
|
|||||||
ngx_str_t *file, ngx_str_t *responder, ngx_uint_t verify);
|
ngx_str_t *file, ngx_str_t *responder, ngx_uint_t verify);
|
||||||
ngx_int_t ngx_ssl_stapling_resolver(ngx_conf_t *cf, ngx_ssl_t *ssl,
|
ngx_int_t ngx_ssl_stapling_resolver(ngx_conf_t *cf, ngx_ssl_t *ssl,
|
||||||
ngx_resolver_t *resolver, ngx_msec_t resolver_timeout);
|
ngx_resolver_t *resolver, ngx_msec_t resolver_timeout);
|
||||||
|
ngx_int_t ngx_ssl_ocsp(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *responder,
|
||||||
|
ngx_uint_t depth, ngx_shm_zone_t *shm_zone);
|
||||||
|
ngx_int_t ngx_ssl_ocsp_resolver(ngx_conf_t *cf, ngx_ssl_t *ssl,
|
||||||
|
ngx_resolver_t *resolver, ngx_msec_t resolver_timeout);
|
||||||
|
ngx_int_t ngx_ssl_ocsp_validate(ngx_connection_t *c);
|
||||||
|
ngx_int_t ngx_ssl_ocsp_get_status(ngx_connection_t *c, const char **s);
|
||||||
|
void ngx_ssl_ocsp_cleanup(ngx_connection_t *c);
|
||||||
|
ngx_int_t ngx_ssl_ocsp_cache_init(ngx_shm_zone_t *shm_zone, void *data);
|
||||||
RSA *ngx_ssl_rsa512_key_callback(ngx_ssl_conn_t *ssl_conn, int is_export,
|
RSA *ngx_ssl_rsa512_key_callback(ngx_ssl_conn_t *ssl_conn, int is_export,
|
||||||
int key_length);
|
int key_length);
|
||||||
ngx_array_t *ngx_ssl_read_password_file(ngx_conf_t *cf, ngx_str_t *file);
|
ngx_array_t *ngx_ssl_read_password_file(ngx_conf_t *cf, ngx_str_t *file);
|
||||||
@ -288,6 +302,7 @@ extern int ngx_ssl_connection_index;
|
|||||||
extern int ngx_ssl_server_conf_index;
|
extern int ngx_ssl_server_conf_index;
|
||||||
extern int ngx_ssl_session_cache_index;
|
extern int ngx_ssl_session_cache_index;
|
||||||
extern int ngx_ssl_session_ticket_keys_index;
|
extern int ngx_ssl_session_ticket_keys_index;
|
||||||
|
extern int ngx_ssl_ocsp_index;
|
||||||
extern int ngx_ssl_certificate_index;
|
extern int ngx_ssl_certificate_index;
|
||||||
extern int ngx_ssl_next_certificate_index;
|
extern int ngx_ssl_next_certificate_index;
|
||||||
extern int ngx_ssl_certificate_name_index;
|
extern int ngx_ssl_certificate_name_index;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -120,6 +120,7 @@ typedef struct {
|
|||||||
unsigned end_stream:1;
|
unsigned end_stream:1;
|
||||||
unsigned done:1;
|
unsigned done:1;
|
||||||
unsigned status:1;
|
unsigned status:1;
|
||||||
|
unsigned rst:1;
|
||||||
|
|
||||||
ngx_http_request_t *request;
|
ngx_http_request_t *request;
|
||||||
|
|
||||||
@ -1205,6 +1206,7 @@ ngx_http_grpc_reinit_request(ngx_http_request_t *r)
|
|||||||
ctx->end_stream = 0;
|
ctx->end_stream = 0;
|
||||||
ctx->done = 0;
|
ctx->done = 0;
|
||||||
ctx->status = 0;
|
ctx->status = 0;
|
||||||
|
ctx->rst = 0;
|
||||||
ctx->connection = NULL;
|
ctx->connection = NULL;
|
||||||
|
|
||||||
return NGX_OK;
|
return NGX_OK;
|
||||||
@ -2088,7 +2090,10 @@ ngx_http_grpc_filter(void *data, ssize_t bytes)
|
|||||||
return NGX_ERROR;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctx->stream_id && ctx->done) {
|
if (ctx->stream_id && ctx->done
|
||||||
|
&& ctx->type != NGX_HTTP_V2_RST_STREAM_FRAME
|
||||||
|
&& ctx->type != NGX_HTTP_V2_WINDOW_UPDATE_FRAME)
|
||||||
|
{
|
||||||
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
|
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
|
||||||
"upstream sent frame for closed stream %ui",
|
"upstream sent frame for closed stream %ui",
|
||||||
ctx->stream_id);
|
ctx->stream_id);
|
||||||
@ -2131,11 +2136,21 @@ ngx_http_grpc_filter(void *data, ssize_t bytes)
|
|||||||
return NGX_ERROR;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
|
if (ctx->error || !ctx->done) {
|
||||||
"upstream rejected request with error %ui",
|
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
|
||||||
ctx->error);
|
"upstream rejected request with error %ui",
|
||||||
|
ctx->error);
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
return NGX_ERROR;
|
if (ctx->rst) {
|
||||||
|
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
|
||||||
|
"upstream sent frame for closed stream %ui",
|
||||||
|
ctx->stream_id);
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx->rst = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctx->type == NGX_HTTP_V2_GOAWAY_FRAME) {
|
if (ctx->type == NGX_HTTP_V2_GOAWAY_FRAME) {
|
||||||
|
@ -50,6 +50,8 @@ static char *ngx_http_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd,
|
|||||||
void *conf);
|
void *conf);
|
||||||
static char *ngx_http_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd,
|
static char *ngx_http_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||||
void *conf);
|
void *conf);
|
||||||
|
static char *ngx_http_ssl_ocsp_cache(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||||
|
void *conf);
|
||||||
|
|
||||||
static ngx_int_t ngx_http_ssl_init(ngx_conf_t *cf);
|
static ngx_int_t ngx_http_ssl_init(ngx_conf_t *cf);
|
||||||
|
|
||||||
@ -74,6 +76,14 @@ static ngx_conf_enum_t ngx_http_ssl_verify[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_conf_enum_t ngx_http_ssl_ocsp[] = {
|
||||||
|
{ ngx_string("off"), 0 },
|
||||||
|
{ ngx_string("on"), 1 },
|
||||||
|
{ ngx_string("leaf"), 2 },
|
||||||
|
{ ngx_null_string, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
static ngx_conf_deprecated_t ngx_http_ssl_deprecated = {
|
static ngx_conf_deprecated_t ngx_http_ssl_deprecated = {
|
||||||
ngx_conf_deprecated, "ssl", "listen ... ssl"
|
ngx_conf_deprecated, "ssl", "listen ... ssl"
|
||||||
};
|
};
|
||||||
@ -214,6 +224,27 @@ static ngx_command_t ngx_http_ssl_commands[] = {
|
|||||||
offsetof(ngx_http_ssl_srv_conf_t, crl),
|
offsetof(ngx_http_ssl_srv_conf_t, crl),
|
||||||
NULL },
|
NULL },
|
||||||
|
|
||||||
|
{ ngx_string("ssl_ocsp"),
|
||||||
|
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,
|
||||||
|
ngx_conf_set_enum_slot,
|
||||||
|
NGX_HTTP_SRV_CONF_OFFSET,
|
||||||
|
offsetof(ngx_http_ssl_srv_conf_t, ocsp),
|
||||||
|
&ngx_http_ssl_ocsp },
|
||||||
|
|
||||||
|
{ ngx_string("ssl_ocsp_responder"),
|
||||||
|
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
|
||||||
|
ngx_conf_set_str_slot,
|
||||||
|
NGX_HTTP_SRV_CONF_OFFSET,
|
||||||
|
offsetof(ngx_http_ssl_srv_conf_t, ocsp_responder),
|
||||||
|
NULL },
|
||||||
|
|
||||||
|
{ ngx_string("ssl_ocsp_cache"),
|
||||||
|
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
|
||||||
|
ngx_http_ssl_ocsp_cache,
|
||||||
|
NGX_HTTP_SRV_CONF_OFFSET,
|
||||||
|
0,
|
||||||
|
NULL },
|
||||||
|
|
||||||
{ ngx_string("ssl_stapling"),
|
{ ngx_string("ssl_stapling"),
|
||||||
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,
|
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,
|
||||||
ngx_conf_set_flag_slot,
|
ngx_conf_set_flag_slot,
|
||||||
@ -569,6 +600,7 @@ ngx_http_ssl_create_srv_conf(ngx_conf_t *cf)
|
|||||||
* sscf->crl = { 0, NULL };
|
* sscf->crl = { 0, NULL };
|
||||||
* sscf->ciphers = { 0, NULL };
|
* sscf->ciphers = { 0, NULL };
|
||||||
* sscf->shm_zone = NULL;
|
* sscf->shm_zone = NULL;
|
||||||
|
* sscf->ocsp_responder = { 0, NULL };
|
||||||
* sscf->stapling_file = { 0, NULL };
|
* sscf->stapling_file = { 0, NULL };
|
||||||
* sscf->stapling_responder = { 0, NULL };
|
* sscf->stapling_responder = { 0, NULL };
|
||||||
*/
|
*/
|
||||||
@ -586,6 +618,8 @@ ngx_http_ssl_create_srv_conf(ngx_conf_t *cf)
|
|||||||
sscf->session_timeout = NGX_CONF_UNSET;
|
sscf->session_timeout = NGX_CONF_UNSET;
|
||||||
sscf->session_tickets = NGX_CONF_UNSET;
|
sscf->session_tickets = NGX_CONF_UNSET;
|
||||||
sscf->session_ticket_keys = NGX_CONF_UNSET_PTR;
|
sscf->session_ticket_keys = NGX_CONF_UNSET_PTR;
|
||||||
|
sscf->ocsp = NGX_CONF_UNSET_UINT;
|
||||||
|
sscf->ocsp_cache_zone = NGX_CONF_UNSET_PTR;
|
||||||
sscf->stapling = NGX_CONF_UNSET;
|
sscf->stapling = NGX_CONF_UNSET;
|
||||||
sscf->stapling_verify = NGX_CONF_UNSET;
|
sscf->stapling_verify = NGX_CONF_UNSET;
|
||||||
|
|
||||||
@ -649,6 +683,11 @@ ngx_http_ssl_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
|
|||||||
|
|
||||||
ngx_conf_merge_str_value(conf->ciphers, prev->ciphers, NGX_DEFAULT_CIPHERS);
|
ngx_conf_merge_str_value(conf->ciphers, prev->ciphers, NGX_DEFAULT_CIPHERS);
|
||||||
|
|
||||||
|
ngx_conf_merge_uint_value(conf->ocsp, prev->ocsp, 0);
|
||||||
|
ngx_conf_merge_str_value(conf->ocsp_responder, prev->ocsp_responder, "");
|
||||||
|
ngx_conf_merge_ptr_value(conf->ocsp_cache_zone,
|
||||||
|
prev->ocsp_cache_zone, NULL);
|
||||||
|
|
||||||
ngx_conf_merge_value(conf->stapling, prev->stapling, 0);
|
ngx_conf_merge_value(conf->stapling, prev->stapling, 0);
|
||||||
ngx_conf_merge_value(conf->stapling_verify, prev->stapling_verify, 0);
|
ngx_conf_merge_value(conf->stapling_verify, prev->stapling_verify, 0);
|
||||||
ngx_conf_merge_str_value(conf->stapling_file, prev->stapling_file, "");
|
ngx_conf_merge_str_value(conf->stapling_file, prev->stapling_file, "");
|
||||||
@ -810,6 +849,23 @@ ngx_http_ssl_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
|
|||||||
return NGX_CONF_ERROR;
|
return NGX_CONF_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (conf->ocsp) {
|
||||||
|
|
||||||
|
if (conf->verify == 3) {
|
||||||
|
ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
|
||||||
|
"\"ssl_ocsp\" is incompatible with "
|
||||||
|
"\"ssl_verify_client optional_no_ca\"");
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ngx_ssl_ocsp(cf, &conf->ssl, &conf->ocsp_responder, conf->ocsp,
|
||||||
|
conf->ocsp_cache_zone)
|
||||||
|
!= NGX_OK)
|
||||||
|
{
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (ngx_ssl_dhparam(cf, &conf->ssl, &conf->dhparam) != NGX_OK) {
|
if (ngx_ssl_dhparam(cf, &conf->ssl, &conf->dhparam) != NGX_OK) {
|
||||||
return NGX_CONF_ERROR;
|
return NGX_CONF_ERROR;
|
||||||
}
|
}
|
||||||
@ -1108,6 +1164,85 @@ invalid:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ngx_http_ssl_ocsp_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||||
|
{
|
||||||
|
ngx_http_ssl_srv_conf_t *sscf = conf;
|
||||||
|
|
||||||
|
size_t len;
|
||||||
|
ngx_int_t n;
|
||||||
|
ngx_str_t *value, name, size;
|
||||||
|
ngx_uint_t j;
|
||||||
|
|
||||||
|
if (sscf->ocsp_cache_zone != NGX_CONF_UNSET_PTR) {
|
||||||
|
return "is duplicate";
|
||||||
|
}
|
||||||
|
|
||||||
|
value = cf->args->elts;
|
||||||
|
|
||||||
|
if (ngx_strcmp(value[1].data, "off") == 0) {
|
||||||
|
sscf->ocsp_cache_zone = NULL;
|
||||||
|
return NGX_CONF_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value[1].len <= sizeof("shared:") - 1
|
||||||
|
|| ngx_strncmp(value[1].data, "shared:", sizeof("shared:") - 1) != 0)
|
||||||
|
{
|
||||||
|
goto invalid;
|
||||||
|
}
|
||||||
|
|
||||||
|
len = 0;
|
||||||
|
|
||||||
|
for (j = sizeof("shared:") - 1; j < value[1].len; j++) {
|
||||||
|
if (value[1].data[j] == ':') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
len++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len == 0) {
|
||||||
|
goto invalid;
|
||||||
|
}
|
||||||
|
|
||||||
|
name.len = len;
|
||||||
|
name.data = value[1].data + sizeof("shared:") - 1;
|
||||||
|
|
||||||
|
size.len = value[1].len - j - 1;
|
||||||
|
size.data = name.data + len + 1;
|
||||||
|
|
||||||
|
n = ngx_parse_size(&size);
|
||||||
|
|
||||||
|
if (n == NGX_ERROR) {
|
||||||
|
goto invalid;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n < (ngx_int_t) (8 * ngx_pagesize)) {
|
||||||
|
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
||||||
|
"OCSP cache \"%V\" is too small", &value[1]);
|
||||||
|
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
sscf->ocsp_cache_zone = ngx_shared_memory_add(cf, &name, n,
|
||||||
|
&ngx_http_ssl_module_ctx);
|
||||||
|
if (sscf->ocsp_cache_zone == NULL) {
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
sscf->ocsp_cache_zone->init = ngx_ssl_ocsp_cache_init;
|
||||||
|
|
||||||
|
return NGX_CONF_OK;
|
||||||
|
|
||||||
|
invalid:
|
||||||
|
|
||||||
|
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
||||||
|
"invalid OCSP cache \"%V\"", &value[1]);
|
||||||
|
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static ngx_int_t
|
static ngx_int_t
|
||||||
ngx_http_ssl_init(ngx_conf_t *cf)
|
ngx_http_ssl_init(ngx_conf_t *cf)
|
||||||
{
|
{
|
||||||
@ -1126,17 +1261,28 @@ ngx_http_ssl_init(ngx_conf_t *cf)
|
|||||||
|
|
||||||
sscf = cscfp[s]->ctx->srv_conf[ngx_http_ssl_module.ctx_index];
|
sscf = cscfp[s]->ctx->srv_conf[ngx_http_ssl_module.ctx_index];
|
||||||
|
|
||||||
if (sscf->ssl.ctx == NULL || !sscf->stapling) {
|
if (sscf->ssl.ctx == NULL) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
clcf = cscfp[s]->ctx->loc_conf[ngx_http_core_module.ctx_index];
|
clcf = cscfp[s]->ctx->loc_conf[ngx_http_core_module.ctx_index];
|
||||||
|
|
||||||
if (ngx_ssl_stapling_resolver(cf, &sscf->ssl, clcf->resolver,
|
if (sscf->stapling) {
|
||||||
|
if (ngx_ssl_stapling_resolver(cf, &sscf->ssl, clcf->resolver,
|
||||||
|
clcf->resolver_timeout)
|
||||||
|
!= NGX_OK)
|
||||||
|
{
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sscf->ocsp) {
|
||||||
|
if (ngx_ssl_ocsp_resolver(cf, &sscf->ssl, clcf->resolver,
|
||||||
clcf->resolver_timeout)
|
clcf->resolver_timeout)
|
||||||
!= NGX_OK)
|
!= NGX_OK)
|
||||||
{
|
{
|
||||||
return NGX_ERROR;
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,6 +54,10 @@ typedef struct {
|
|||||||
ngx_flag_t session_tickets;
|
ngx_flag_t session_tickets;
|
||||||
ngx_array_t *session_ticket_keys;
|
ngx_array_t *session_ticket_keys;
|
||||||
|
|
||||||
|
ngx_uint_t ocsp;
|
||||||
|
ngx_str_t ocsp_responder;
|
||||||
|
ngx_shm_zone_t *ocsp_cache_zone;
|
||||||
|
|
||||||
ngx_flag_t stapling;
|
ngx_flag_t stapling;
|
||||||
ngx_flag_t stapling_verify;
|
ngx_flag_t stapling_verify;
|
||||||
ngx_str_t stapling_file;
|
ngx_str_t stapling_file;
|
||||||
|
@ -2127,6 +2127,7 @@ ngx_http_process_request(ngx_http_request_t *r)
|
|||||||
if (r->http_connection->ssl) {
|
if (r->http_connection->ssl) {
|
||||||
long rc;
|
long rc;
|
||||||
X509 *cert;
|
X509 *cert;
|
||||||
|
const char *s;
|
||||||
ngx_http_ssl_srv_conf_t *sscf;
|
ngx_http_ssl_srv_conf_t *sscf;
|
||||||
|
|
||||||
if (c->ssl == NULL) {
|
if (c->ssl == NULL) {
|
||||||
@ -2171,6 +2172,17 @@ ngx_http_process_request(ngx_http_request_t *r)
|
|||||||
|
|
||||||
X509_free(cert);
|
X509_free(cert);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ngx_ssl_ocsp_get_status(c, &s) != NGX_OK) {
|
||||||
|
ngx_log_error(NGX_LOG_INFO, c->log, 0,
|
||||||
|
"client SSL certificate verify error: %s", s);
|
||||||
|
|
||||||
|
ngx_ssl_remove_cached_session(c->ssl->session_ctx,
|
||||||
|
(SSL_get0_session(c->ssl->connection)));
|
||||||
|
|
||||||
|
ngx_http_finalize_request(r, NGX_HTTPS_CERT_ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2502,6 +2502,8 @@ ngx_http_upstream_test_next(ngx_http_request_t *r, ngx_http_upstream_t *u)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (NGX_HTTP_CACHE)
|
#if (NGX_HTTP_CACHE)
|
||||||
|
@ -1075,7 +1075,7 @@ ngx_http_variable_argument(ngx_http_request_t *r, ngx_http_variable_value_t *v,
|
|||||||
len = name->len - (sizeof("arg_") - 1);
|
len = name->len - (sizeof("arg_") - 1);
|
||||||
arg = name->data + sizeof("arg_") - 1;
|
arg = name->data + sizeof("arg_") - 1;
|
||||||
|
|
||||||
if (ngx_http_arg(r, arg, len, &value) != NGX_OK) {
|
if (len == 0 || ngx_http_arg(r, arg, len, &value) != NGX_OK) {
|
||||||
v->not_found = 1;
|
v->not_found = 1;
|
||||||
return NGX_OK;
|
return NGX_OK;
|
||||||
}
|
}
|
||||||
|
@ -731,9 +731,8 @@ ngx_http_v2_state_preface(ngx_http_v2_connection_t *h2c, u_char *pos,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ngx_memcmp(pos, preface, sizeof(preface) - 1) != 0) {
|
if (ngx_memcmp(pos, preface, sizeof(preface) - 1) != 0) {
|
||||||
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
|
ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
|
||||||
"invalid http2 connection preface \"%*s\"",
|
"invalid connection preface");
|
||||||
sizeof(preface) - 1, pos);
|
|
||||||
|
|
||||||
return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);
|
return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);
|
||||||
}
|
}
|
||||||
@ -754,9 +753,8 @@ ngx_http_v2_state_preface_end(ngx_http_v2_connection_t *h2c, u_char *pos,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ngx_memcmp(pos, preface, sizeof(preface) - 1) != 0) {
|
if (ngx_memcmp(pos, preface, sizeof(preface) - 1) != 0) {
|
||||||
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
|
ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
|
||||||
"invalid http2 connection preface \"%*s\"",
|
"invalid connection preface");
|
||||||
sizeof(preface) - 1, pos);
|
|
||||||
|
|
||||||
return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);
|
return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user