[PATCH 1 of 1] allow to use engine keyform for server private key

Maxim Dounin mdounin at mdounin.ru
Tue Jul 29 15:40:24 UTC 2014


Hello!

On Tue, Jul 29, 2014 at 07:11:27PM +0400, Dmitrii Pichulin wrote:

> # HG changeset patch
> # User Dmitrii Pichulin
> # Date 1406644835 -14400
> #      Tue Jul 29 18:40:35 2014 +0400
> # Node ID b5f409eef2ed6832eead4c53855f91fb90ee099b
> # Parent  d1bde5c3c5d21368de04a59506a06c1174353a19
> allow to use engine keyform for server private key
> 
> diff -r d1bde5c3c5d2 -r b5f409eef2ed src/event/ngx_event_openssl.c
> --- a/src/event/ngx_event_openssl.c	Mon Jul 28 18:30:19 2014 +0400
> +++ b/src/event/ngx_event_openssl.c	Tue Jul 29 18:40:35 2014 +0400
> @@ -265,8 +265,11 @@
>  ngx_ssl_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert,
>      ngx_str_t *key, ngx_array_t *passwords)
>  {
> +    char        *p, *last;
>      BIO         *bio;
>      X509        *x509;
> +    ENGINE      *engine;
> +    EVP_PKEY    *private_key;
>      u_long       n;
>      ngx_str_t   *pwd;
>      ngx_uint_t   tries;
> @@ -352,6 +355,54 @@
>  
>      BIO_free(bio);
>  
> +    if (ngx_strncmp(key->data, "engine:", sizeof("engine:") - 1) == 0) {
> +
> +        p = (char *) key->data + sizeof("engine:") - 1;
> +        last = ngx_strchr(p, ':');
> +
> +        if (last == NULL) {
> +            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid syntax: %V", key);
> +            return NGX_ERROR;
> +        }
> +
> +        p[last - p] = '\0';
> +        last++;
> +
> +        engine = ENGINE_by_id(p);
> +
> +        if (engine == NULL) {
> +            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,
> +                          "ENGINE_by_id(\"%s\") failed", p);
> +            return NGX_ERROR;
> +        }
> +
> +        private_key = ENGINE_load_private_key(engine, last, 0, 0);
> +        
> +        if (ENGINE_free(engine) == 0) {
> +            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, "ENGINE_free() failed");
> +            if (private_key)
> +                EVP_PKEY_free(private_key);

Style: curly brackets are always used with if's.

> +            return NGX_ERROR;
> +        }
> +
> +        if (private_key == NULL) {
> +            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,
> +                          "ENGINE_load_private_key(\"%s\") failed", last);
> +            return NGX_ERROR;
> +        }

As previously suggested, it's bad idea to check/log errors after 
calling other functions which may modify error stack.

> +
> +        if (SSL_CTX_use_PrivateKey(ssl->ctx, private_key) == 0) {
> +            ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0,
> +                          "SSL_CTX_use_PrivateKey_file(\"%s\") failed", last);

Wrong function name logged.

> +            EVP_PKEY_free(private_key);
> +            return NGX_ERROR;
> +        }
> +
> +        EVP_PKEY_free(private_key);
> +
> +        return NGX_OK;
> +    }
> +
>      if (ngx_conf_full_name(cf->cycle, key, 1) != NGX_OK) {
>          return NGX_ERROR;
>      }
> 
> _______________________________________________
> nginx-devel mailing list
> nginx-devel at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-devel

-- 
Maxim Dounin
http://nginx.org/



More information about the nginx-devel mailing list