[PATCH] SSL: add "{proxy, uwsgi}_ssl_verify" and supporting directives
Maxim Dounin
mdounin at mdounin.ru
Thu Feb 6 16:09:55 UTC 2014
Hello!
On Tue, Feb 04, 2014 at 10:54:47PM -0800, Piotr Sikora wrote:
> # HG changeset patch
> # User Piotr Sikora <piotr at cloudflare.com>
> # Date 1391582213 28800
> # Tue Feb 04 22:36:53 2014 -0800
> # Node ID e7704dcea76c83708cd8bf01709e15dc658871ae
> # Parent f0129ac05ced1ee418fa97dbbae35f3c0b831992
> SSL: add "{proxy,uwsgi}_ssl_verify" and supporting directives.
Nitpicking:
It may be better to write about "proxy_..." directives, and
mention uwsgi counterparts separately and/or introduce them in a
separate patch. Cryptic names to mention all the modules aren't
very readable and hardly searchable, so we generally try to avoid
them now.
> Verify SSL certificate when connecting to an SSL upstream.
>
> "{proxy,uwsgi}_ssl_verify" directives support 3 modes:
> - off - don't verify upstream's SSL certificate (default),
> - on - verify validity and trust of upstream's SSL certificate,
> - server_name - same as above, but when SNI is used, also verify
> that it matches one of the hostnames in the certificate. This
> mode requires OpenSSL-1.0.2+.
I don't really like this approach of a special "server_name" value
and SNI dependency, it looks counterintuitive. Peer name
verification should be done by default, and probably there should
be a separate option to turn it off if needed for some reason.
I believe the main reason for SNI dependency is a name to verify
against. In case of proxy, shouldn't it be $proxy_host by
default?
Something like this:
proxy_ssl_verify on;
proxy_ssl_name $proxy_host;
or this:
proxy_ssl_verify on;
proxy_ssl_verify_name off;
And the same name probably may be used for SNI, with an
additional flag to switch it on, like this:
proxy_ssl_sni on;
proxy_ssl_name $proxy_host;
(Well, it might be better to introduce something more generic to
also resolve default proxy_cache_key vs. "proxy_set_header Host"
issue, but I don't see any obvious solution yet.)
What do you think?
[...]
> diff -r f0129ac05ced -r e7704dcea76c src/http/modules/ngx_http_upstream_keepalive_module.c
> --- a/src/http/modules/ngx_http_upstream_keepalive_module.c Tue Feb 04 22:36:41 2014 -0800
> +++ b/src/http/modules/ngx_http_upstream_keepalive_module.c Tue Feb 04 22:36:53 2014 -0800
> @@ -51,6 +51,7 @@ typedef struct {
>
> #if (NGX_HTTP_SSL)
> ngx_str_t server_name;
> + unsigned verify:2;
> #endif
>
> } ngx_http_upstream_keepalive_cache_t;
> @@ -250,6 +251,7 @@ ngx_http_upstream_get_keepalive_peer(ngx
> || ngx_strncmp(pc->server_name.data, item->server_name.data,
> pc->server_name.len)
> == 0)
> + && (pc->verify <= item->verify)
> #endif
> )
> {
> @@ -372,6 +374,8 @@ ngx_http_upstream_free_keepalive_peer(ng
> pc->server_name.len);
> }
>
> + item->verify = pc->verify;
> +
> #endif
>
> if (c->read->ready) {
Not sure if it's needed at all. I think we can safely assume that
verification options are the same in all cases.
--
Maxim Dounin
http://nginx.org/
More information about the nginx-devel
mailing list