aboutsummaryrefslogtreecommitdiff
path: root/src/http/ngx_http_request.c
diff options
context:
space:
mode:
authorValentin Bartenev <vbart@nginx.com>2013-02-27 17:41:34 +0000
committerValentin Bartenev <vbart@nginx.com>2013-02-27 17:41:34 +0000
commitb720f650bb72118481884657fb6a9bcb1b0f3b11 (patch)
treeaa5502f15121433fb6e6807ea125ba6afa498e27 /src/http/ngx_http_request.c
parent6000f4ad6d1e5ea69b3e0925217d08401a3d1774 (diff)
downloadnginx-b720f650bb72118481884657fb6a9bcb1b0f3b11.tar.gz
nginx-b720f650bb72118481884657fb6a9bcb1b0f3b11.zip
SNI: added restriction on requesting host other than negotiated.
According to RFC 6066, client is not supposed to request a different server name at the application layer. Server implementations that rely upon these names being equal must validate that a client did not send a different name in HTTP request. Current versions of Apache HTTP server always return 400 "Bad Request" in such cases. There exist implementations however (e.g., SPDY) that rely on being able to request different host names in one connection. Given this, we only reject requests with differing host names if verification of client certificates is enabled in a corresponding server configuration. An example of configuration that might not work as expected: server { listen 433 ssl default; return 404; } server { listen 433 ssl; server_name example.org; ssl_client_certificate org.cert; ssl_verify_client on; } server { listen 433 ssl; server_name example.com; ssl_client_certificate com.cert; ssl_verify_client on; } Previously, a client was able to request example.com by presenting a certificate for example.org, and vice versa.
Diffstat (limited to 'src/http/ngx_http_request.c')
-rw-r--r--src/http/ngx_http_request.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
index bb4cacabd..0cb081c74 100644
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -1872,10 +1872,22 @@ ngx_http_set_virtual_server(ngx_http_request_t *r, ngx_str_t *host)
#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
if (hc->ssl_servername) {
+ ngx_http_ssl_srv_conf_t *sscf;
+
if (rc == NGX_DECLINED) {
cscf = hc->addr_conf->default_server;
rc = NGX_OK;
}
+
+ sscf = ngx_http_get_module_srv_conf(cscf->ctx, ngx_http_ssl_module);
+
+ if (sscf->verify) {
+ ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
+ "client attempted to request the server name "
+ "different from that one was negotiated");
+ ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);
+ return NGX_ERROR;
+ }
}
#endif