mirror of
https://github.com/nginx/nginx.git
synced 2025-07-20 19:27:29 +08:00
Merge cb078a3968
into c52c5698cd
This commit is contained in:
commit
771d25a78e
@ -444,10 +444,17 @@ ngx_ssl_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert,
|
|||||||
{
|
{
|
||||||
char *err;
|
char *err;
|
||||||
X509 *x509, **elm;
|
X509 *x509, **elm;
|
||||||
|
u_long n;
|
||||||
EVP_PKEY *pkey;
|
EVP_PKEY *pkey;
|
||||||
|
ngx_uint_t mask;
|
||||||
STACK_OF(X509) *chain;
|
STACK_OF(X509) *chain;
|
||||||
|
|
||||||
chain = ngx_ssl_cache_fetch(cf, NGX_SSL_CACHE_CERT, &err, cert, NULL);
|
mask = 0;
|
||||||
|
|
||||||
|
retry:
|
||||||
|
|
||||||
|
chain = ngx_ssl_cache_fetch(cf, NGX_SSL_CACHE_CERT | mask,
|
||||||
|
&err, cert, NULL);
|
||||||
if (chain == NULL) {
|
if (chain == NULL) {
|
||||||
if (err != NULL) {
|
if (err != NULL) {
|
||||||
ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,
|
ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,
|
||||||
@ -537,7 +544,8 @@ ngx_ssl_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pkey = ngx_ssl_cache_fetch(cf, NGX_SSL_CACHE_PKEY, &err, key, passwords);
|
pkey = ngx_ssl_cache_fetch(cf, NGX_SSL_CACHE_PKEY | mask,
|
||||||
|
&err, key, passwords);
|
||||||
if (pkey == NULL) {
|
if (pkey == NULL) {
|
||||||
if (err != NULL) {
|
if (err != NULL) {
|
||||||
ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,
|
ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,
|
||||||
@ -549,9 +557,23 @@ ngx_ssl_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (SSL_CTX_use_PrivateKey(ssl->ctx, pkey) == 0) {
|
if (SSL_CTX_use_PrivateKey(ssl->ctx, pkey) == 0) {
|
||||||
|
EVP_PKEY_free(pkey);
|
||||||
|
|
||||||
|
/* there can be mismatched pairs on uneven cache update */
|
||||||
|
|
||||||
|
n = ERR_peek_last_error();
|
||||||
|
|
||||||
|
if (ERR_GET_LIB(n) == ERR_LIB_X509
|
||||||
|
&& ERR_GET_REASON(n) == X509_R_KEY_VALUES_MISMATCH
|
||||||
|
&& mask == 0)
|
||||||
|
{
|
||||||
|
ERR_clear_error();
|
||||||
|
mask = NGX_SSL_CACHE_INVALIDATE;
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
|
||||||
ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,
|
ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,
|
||||||
"SSL_CTX_use_PrivateKey(\"%s\") failed", key->data);
|
"SSL_CTX_use_PrivateKey(\"%s\") failed", key->data);
|
||||||
EVP_PKEY_free(pkey);
|
|
||||||
return NGX_ERROR;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,6 +193,7 @@ ngx_ssl_cache_fetch(ngx_conf_t *cf, ngx_uint_t index, char **err,
|
|||||||
time_t mtime;
|
time_t mtime;
|
||||||
uint32_t hash;
|
uint32_t hash;
|
||||||
ngx_int_t rc;
|
ngx_int_t rc;
|
||||||
|
ngx_uint_t invalidate;
|
||||||
ngx_file_uniq_t uniq;
|
ngx_file_uniq_t uniq;
|
||||||
ngx_file_info_t fi;
|
ngx_file_info_t fi;
|
||||||
ngx_ssl_cache_t *cache, *old_cache;
|
ngx_ssl_cache_t *cache, *old_cache;
|
||||||
@ -202,6 +203,9 @@ ngx_ssl_cache_fetch(ngx_conf_t *cf, ngx_uint_t index, char **err,
|
|||||||
|
|
||||||
*err = NULL;
|
*err = NULL;
|
||||||
|
|
||||||
|
invalidate = index & NGX_SSL_CACHE_INVALIDATE;
|
||||||
|
index &= ~NGX_SSL_CACHE_INVALIDATE;
|
||||||
|
|
||||||
if (ngx_ssl_cache_init_key(cf->pool, index, path, &id) != NGX_OK) {
|
if (ngx_ssl_cache_init_key(cf->pool, index, path, &id) != NGX_OK) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -215,9 +219,14 @@ ngx_ssl_cache_fetch(ngx_conf_t *cf, ngx_uint_t index, char **err,
|
|||||||
cn = ngx_ssl_cache_lookup(cache, type, &id, hash);
|
cn = ngx_ssl_cache_lookup(cache, type, &id, hash);
|
||||||
|
|
||||||
if (cn != NULL) {
|
if (cn != NULL) {
|
||||||
|
if (!invalidate || id.type != NGX_SSL_CACHE_PATH) {
|
||||||
return type->ref(err, cn->value);
|
return type->ref(err, cn->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type->free(cn->value);
|
||||||
|
ngx_rbtree_delete(&cache->rbtree, &cn->node);
|
||||||
|
}
|
||||||
|
|
||||||
value = NULL;
|
value = NULL;
|
||||||
|
|
||||||
if (id.type == NGX_SSL_CACHE_PATH
|
if (id.type == NGX_SSL_CACHE_PATH
|
||||||
@ -236,7 +245,7 @@ ngx_ssl_cache_fetch(ngx_conf_t *cf, ngx_uint_t index, char **err,
|
|||||||
|
|
||||||
old_cache = ngx_ssl_cache_get_old_conf(cf->cycle);
|
old_cache = ngx_ssl_cache_get_old_conf(cf->cycle);
|
||||||
|
|
||||||
if (old_cache && old_cache->inheritable) {
|
if (old_cache && old_cache->inheritable && !invalidate) {
|
||||||
cn = ngx_ssl_cache_lookup(old_cache, type, &id, hash);
|
cn = ngx_ssl_cache_lookup(old_cache, type, &id, hash);
|
||||||
|
|
||||||
if (cn != NULL) {
|
if (cn != NULL) {
|
||||||
|
Loading…
Reference in New Issue
Block a user