Skip to content

Commit

Permalink
SSL: only select HTTP/2 using NPN if "http2" is enabled.
Browse files Browse the repository at this point in the history
OpenSSL doesn't check if the negotiated protocol has been announced.
As a result, the client might force using HTTP/2 even if it wasn't
enabled in configuration.
  • Loading branch information
VBart committed Nov 5, 2015
1 parent b22c0e0 commit 93aef08
Showing 1 changed file with 16 additions and 10 deletions.
26 changes: 16 additions & 10 deletions src/http/ngx_http_request.c
Original file line number Diff line number Diff line change
Expand Up @@ -768,25 +768,31 @@ ngx_http_ssl_handshake_handler(ngx_connection_t *c)
&& (defined TLSEXT_TYPE_application_layer_protocol_negotiation \
|| defined TLSEXT_TYPE_next_proto_neg))
{
unsigned int len;
const unsigned char *data;
unsigned int len;
const unsigned char *data;
ngx_http_connection_t *hc;

hc = c->data;

if (hc->addr_conf->http2) {

#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation
SSL_get0_alpn_selected(c->ssl->connection, &data, &len);
SSL_get0_alpn_selected(c->ssl->connection, &data, &len);

#ifdef TLSEXT_TYPE_next_proto_neg
if (len == 0) {
SSL_get0_next_proto_negotiated(c->ssl->connection, &data, &len);
}
if (len == 0) {
SSL_get0_next_proto_negotiated(c->ssl->connection, &data, &len);
}
#endif

#else /* TLSEXT_TYPE_next_proto_neg */
SSL_get0_next_proto_negotiated(c->ssl->connection, &data, &len);
SSL_get0_next_proto_negotiated(c->ssl->connection, &data, &len);
#endif

if (len == 2 && data[0] == 'h' && data[1] == '2') {
ngx_http_v2_init(c->read);
return;
if (len == 2 && data[0] == 'h' && data[1] == '2') {
ngx_http_v2_init(c->read);
return;
}
}
}
#endif
Expand Down

0 comments on commit 93aef08

Please sign in to comment.