annotate src/stream/ngx_stream_ssl_module.c @ 7162:8b84d60ef13d

Fixed "changing binary" when reaper is not init. On some systems, it's possible that reaper of orphaned processes is set to something other than "init" process. On such systems, the changing binary procedure did not work. The fix is to check if PPID has changed, instead of assuming it's always 1 for orphaned processes.
author Ruslan Ermilov <ru@nginx.com>
date Tue, 28 Nov 2017 12:00:24 +0300
parents 82f0b8dcca27
children 9d14931cec8c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2 /*
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
5 */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
6
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
7
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
10 #include <ngx_stream.h>
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
11
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
12
6611
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
13 typedef ngx_int_t (*ngx_ssl_variable_handler_pt)(ngx_connection_t *c,
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
14 ngx_pool_t *pool, ngx_str_t *s);
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
15
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
16
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
17 #define NGX_DEFAULT_CIPHERS "HIGH:!aNULL:!MD5"
6553
2014ed60f17f SSL: support for multiple curves (ticket #885).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6550
diff changeset
18 #define NGX_DEFAULT_ECDH_CURVE "auto"
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
19
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
20
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
21 static ngx_int_t ngx_stream_ssl_handler(ngx_stream_session_t *s);
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
22 static ngx_int_t ngx_stream_ssl_init_connection(ngx_ssl_t *ssl,
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
23 ngx_connection_t *c);
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
24 static void ngx_stream_ssl_handshake_handler(ngx_connection_t *c);
6611
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
25 static ngx_int_t ngx_stream_ssl_static_variable(ngx_stream_session_t *s,
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
26 ngx_stream_variable_value_t *v, uintptr_t data);
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
27 static ngx_int_t ngx_stream_ssl_variable(ngx_stream_session_t *s,
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
28 ngx_stream_variable_value_t *v, uintptr_t data);
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
29
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
30 static ngx_int_t ngx_stream_ssl_add_variables(ngx_conf_t *cf);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
31 static void *ngx_stream_ssl_create_conf(ngx_conf_t *cf);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
32 static char *ngx_stream_ssl_merge_conf(ngx_conf_t *cf, void *parent,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
33 void *child);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
34
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
35 static char *ngx_stream_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
36 void *conf);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
37 static char *ngx_stream_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
38 void *conf);
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
39 static ngx_int_t ngx_stream_ssl_init(ngx_conf_t *cf);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
40
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
41
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
42 static ngx_conf_bitmask_t ngx_stream_ssl_protocols[] = {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
43 { ngx_string("SSLv2"), NGX_SSL_SSLv2 },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
44 { ngx_string("SSLv3"), NGX_SSL_SSLv3 },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
45 { ngx_string("TLSv1"), NGX_SSL_TLSv1 },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
46 { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
47 { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },
6981
08dc60979133 SSL: added support for TLSv1.3 in ssl_protocols directive.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6871
diff changeset
48 { ngx_string("TLSv1.3"), NGX_SSL_TLSv1_3 },
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
49 { ngx_null_string, 0 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
50 };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
51
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
52
6850
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
53 static ngx_conf_enum_t ngx_stream_ssl_verify[] = {
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
54 { ngx_string("off"), 0 },
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
55 { ngx_string("on"), 1 },
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
56 { ngx_string("optional"), 2 },
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
57 { ngx_string("optional_no_ca"), 3 },
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
58 { ngx_null_string, 0 }
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
59 };
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
60
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
61
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
62 static ngx_command_t ngx_stream_ssl_commands[] = {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
63
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
64 { ngx_string("ssl_handshake_timeout"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
65 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
66 ngx_conf_set_msec_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
67 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
68 offsetof(ngx_stream_ssl_conf_t, handshake_timeout),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
69 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
70
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
71 { ngx_string("ssl_certificate"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
72 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
6550
51e1f047d15d SSL: support for multiple certificates (ticket #814).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6489
diff changeset
73 ngx_conf_set_str_array_slot,
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
74 NGX_STREAM_SRV_CONF_OFFSET,
6550
51e1f047d15d SSL: support for multiple certificates (ticket #814).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6489
diff changeset
75 offsetof(ngx_stream_ssl_conf_t, certificates),
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
76 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
77
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
78 { ngx_string("ssl_certificate_key"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
79 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
6550
51e1f047d15d SSL: support for multiple certificates (ticket #814).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6489
diff changeset
80 ngx_conf_set_str_array_slot,
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
81 NGX_STREAM_SRV_CONF_OFFSET,
6550
51e1f047d15d SSL: support for multiple certificates (ticket #814).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6489
diff changeset
82 offsetof(ngx_stream_ssl_conf_t, certificate_keys),
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
83 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
84
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
85 { ngx_string("ssl_password_file"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
86 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
87 ngx_stream_ssl_password_file,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
88 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
89 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
90 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
91
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
92 { ngx_string("ssl_dhparam"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
93 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
94 ngx_conf_set_str_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
95 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
96 offsetof(ngx_stream_ssl_conf_t, dhparam),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
97 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
98
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
99 { ngx_string("ssl_ecdh_curve"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
100 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
101 ngx_conf_set_str_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
102 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
103 offsetof(ngx_stream_ssl_conf_t, ecdh_curve),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
104 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
105
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
106 { ngx_string("ssl_protocols"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
107 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_1MORE,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
108 ngx_conf_set_bitmask_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
109 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
110 offsetof(ngx_stream_ssl_conf_t, protocols),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
111 &ngx_stream_ssl_protocols },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
112
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
113 { ngx_string("ssl_ciphers"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
114 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
115 ngx_conf_set_str_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
116 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
117 offsetof(ngx_stream_ssl_conf_t, ciphers),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
118 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
119
6850
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
120 { ngx_string("ssl_verify_client"),
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
121 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
122 ngx_conf_set_enum_slot,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
123 NGX_STREAM_SRV_CONF_OFFSET,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
124 offsetof(ngx_stream_ssl_conf_t, verify),
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
125 &ngx_stream_ssl_verify },
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
126
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
127 { ngx_string("ssl_verify_depth"),
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
128 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
129 ngx_conf_set_num_slot,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
130 NGX_STREAM_SRV_CONF_OFFSET,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
131 offsetof(ngx_stream_ssl_conf_t, verify_depth),
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
132 NULL },
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
133
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
134 { ngx_string("ssl_client_certificate"),
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
135 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
136 ngx_conf_set_str_slot,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
137 NGX_STREAM_SRV_CONF_OFFSET,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
138 offsetof(ngx_stream_ssl_conf_t, client_certificate),
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
139 NULL },
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
140
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
141 { ngx_string("ssl_trusted_certificate"),
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
142 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
143 ngx_conf_set_str_slot,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
144 NGX_STREAM_SRV_CONF_OFFSET,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
145 offsetof(ngx_stream_ssl_conf_t, trusted_certificate),
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
146 NULL },
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
147
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
148 { ngx_string("ssl_prefer_server_ciphers"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
149 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
150 ngx_conf_set_flag_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
151 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
152 offsetof(ngx_stream_ssl_conf_t, prefer_server_ciphers),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
153 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
154
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
155 { ngx_string("ssl_session_cache"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
156 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE12,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
157 ngx_stream_ssl_session_cache,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
158 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
159 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
160 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
161
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
162 { ngx_string("ssl_session_tickets"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
163 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
164 ngx_conf_set_flag_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
165 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
166 offsetof(ngx_stream_ssl_conf_t, session_tickets),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
167 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
168
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
169 { ngx_string("ssl_session_ticket_key"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
170 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
171 ngx_conf_set_str_array_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
172 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
173 offsetof(ngx_stream_ssl_conf_t, session_ticket_keys),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
174 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
175
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
176 { ngx_string("ssl_session_timeout"),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
177 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
178 ngx_conf_set_sec_slot,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
179 NGX_STREAM_SRV_CONF_OFFSET,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
180 offsetof(ngx_stream_ssl_conf_t, session_timeout),
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
181 NULL },
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
182
6850
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
183 { ngx_string("ssl_crl"),
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
184 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
185 ngx_conf_set_str_slot,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
186 NGX_STREAM_SRV_CONF_OFFSET,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
187 offsetof(ngx_stream_ssl_conf_t, crl),
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
188 NULL },
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
189
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
190 ngx_null_command
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
191 };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
192
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
193
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
194 static ngx_stream_module_t ngx_stream_ssl_module_ctx = {
6611
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
195 ngx_stream_ssl_add_variables, /* preconfiguration */
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
196 ngx_stream_ssl_init, /* postconfiguration */
6174
68c106e6fa0a Stream: added postconfiguration method to stream modules.
Vladimir Homutov <vl@nginx.com>
parents: 6157
diff changeset
197
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
198 NULL, /* create main configuration */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
199 NULL, /* init main configuration */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
200
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
201 ngx_stream_ssl_create_conf, /* create server configuration */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
202 ngx_stream_ssl_merge_conf /* merge server configuration */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
203 };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
204
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
205
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
206 ngx_module_t ngx_stream_ssl_module = {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
207 NGX_MODULE_V1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
208 &ngx_stream_ssl_module_ctx, /* module context */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
209 ngx_stream_ssl_commands, /* module directives */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
210 NGX_STREAM_MODULE, /* module type */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
211 NULL, /* init master */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
212 NULL, /* init module */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
213 NULL, /* init process */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
214 NULL, /* init thread */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
215 NULL, /* exit thread */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
216 NULL, /* exit process */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
217 NULL, /* exit master */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
218 NGX_MODULE_V1_PADDING
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
219 };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
220
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
221
6611
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
222 static ngx_stream_variable_t ngx_stream_ssl_vars[] = {
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
223
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
224 { ngx_string("ssl_protocol"), NULL, ngx_stream_ssl_static_variable,
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
225 (uintptr_t) ngx_ssl_get_protocol, NGX_STREAM_VAR_CHANGEABLE, 0 },
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
226
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
227 { ngx_string("ssl_cipher"), NULL, ngx_stream_ssl_static_variable,
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
228 (uintptr_t) ngx_ssl_get_cipher_name, NGX_STREAM_VAR_CHANGEABLE, 0 },
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
229
6816
ea93c7d8752a SSL: $ssl_ciphers (ticket #870).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6693
diff changeset
230 { ngx_string("ssl_ciphers"), NULL, ngx_stream_ssl_variable,
ea93c7d8752a SSL: $ssl_ciphers (ticket #870).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6693
diff changeset
231 (uintptr_t) ngx_ssl_get_ciphers, NGX_STREAM_VAR_CHANGEABLE, 0 },
ea93c7d8752a SSL: $ssl_ciphers (ticket #870).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6693
diff changeset
232
6817
e75e854657ba SSL: $ssl_curves (ticket #1088).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6816
diff changeset
233 { ngx_string("ssl_curves"), NULL, ngx_stream_ssl_variable,
e75e854657ba SSL: $ssl_curves (ticket #1088).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6816
diff changeset
234 (uintptr_t) ngx_ssl_get_curves, NGX_STREAM_VAR_CHANGEABLE, 0 },
e75e854657ba SSL: $ssl_curves (ticket #1088).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6816
diff changeset
235
6611
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
236 { ngx_string("ssl_session_id"), NULL, ngx_stream_ssl_variable,
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
237 (uintptr_t) ngx_ssl_get_session_id, NGX_STREAM_VAR_CHANGEABLE, 0 },
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
238
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
239 { ngx_string("ssl_session_reused"), NULL, ngx_stream_ssl_variable,
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
240 (uintptr_t) ngx_ssl_get_session_reused, NGX_STREAM_VAR_CHANGEABLE, 0 },
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
241
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
242 { ngx_string("ssl_server_name"), NULL, ngx_stream_ssl_variable,
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
243 (uintptr_t) ngx_ssl_get_server_name, NGX_STREAM_VAR_CHANGEABLE, 0 },
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
244
6850
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
245 { ngx_string("ssl_client_cert"), NULL, ngx_stream_ssl_variable,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
246 (uintptr_t) ngx_ssl_get_certificate, NGX_STREAM_VAR_CHANGEABLE, 0 },
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
247
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
248 { ngx_string("ssl_client_raw_cert"), NULL, ngx_stream_ssl_variable,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
249 (uintptr_t) ngx_ssl_get_raw_certificate,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
250 NGX_STREAM_VAR_CHANGEABLE, 0 },
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
251
7091
82f0b8dcca27 SSL: the $ssl_client_escaped_cert variable (ticket #857).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7077
diff changeset
252 { ngx_string("ssl_client_escaped_cert"), NULL, ngx_stream_ssl_variable,
82f0b8dcca27 SSL: the $ssl_client_escaped_cert variable (ticket #857).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7077
diff changeset
253 (uintptr_t) ngx_ssl_get_escaped_certificate,
82f0b8dcca27 SSL: the $ssl_client_escaped_cert variable (ticket #857).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7077
diff changeset
254 NGX_STREAM_VAR_CHANGEABLE, 0 },
82f0b8dcca27 SSL: the $ssl_client_escaped_cert variable (ticket #857).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7077
diff changeset
255
6850
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
256 { ngx_string("ssl_client_s_dn"), NULL, ngx_stream_ssl_variable,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
257 (uintptr_t) ngx_ssl_get_subject_dn, NGX_STREAM_VAR_CHANGEABLE, 0 },
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
258
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
259 { ngx_string("ssl_client_i_dn"), NULL, ngx_stream_ssl_variable,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
260 (uintptr_t) ngx_ssl_get_issuer_dn, NGX_STREAM_VAR_CHANGEABLE, 0 },
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
261
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
262 { ngx_string("ssl_client_serial"), NULL, ngx_stream_ssl_variable,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
263 (uintptr_t) ngx_ssl_get_serial_number, NGX_STREAM_VAR_CHANGEABLE, 0 },
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
264
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
265 { ngx_string("ssl_client_fingerprint"), NULL, ngx_stream_ssl_variable,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
266 (uintptr_t) ngx_ssl_get_fingerprint, NGX_STREAM_VAR_CHANGEABLE, 0 },
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
267
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
268 { ngx_string("ssl_client_verify"), NULL, ngx_stream_ssl_variable,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
269 (uintptr_t) ngx_ssl_get_client_verify, NGX_STREAM_VAR_CHANGEABLE, 0 },
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
270
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
271 { ngx_string("ssl_client_v_start"), NULL, ngx_stream_ssl_variable,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
272 (uintptr_t) ngx_ssl_get_client_v_start, NGX_STREAM_VAR_CHANGEABLE, 0 },
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
273
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
274 { ngx_string("ssl_client_v_end"), NULL, ngx_stream_ssl_variable,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
275 (uintptr_t) ngx_ssl_get_client_v_end, NGX_STREAM_VAR_CHANGEABLE, 0 },
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
276
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
277 { ngx_string("ssl_client_v_remain"), NULL, ngx_stream_ssl_variable,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
278 (uintptr_t) ngx_ssl_get_client_v_remain, NGX_STREAM_VAR_CHANGEABLE, 0 },
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
279
7077
2a288909abc6 Variables: macros for null variables.
Ruslan Ermilov <ru@nginx.com>
parents: 7009
diff changeset
280 ngx_stream_null_variable
6611
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
281 };
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
282
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
283
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
284 static ngx_str_t ngx_stream_ssl_sess_id_ctx = ngx_string("STREAM");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
285
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
286
6611
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
287 static ngx_int_t
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
288 ngx_stream_ssl_handler(ngx_stream_session_t *s)
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
289 {
6850
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
290 long rc;
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
291 X509 *cert;
6871
1818acd8442f Stream: client SSL certificates were not checked in some cases.
Vladimir Homutov <vl@nginx.com>
parents: 6870
diff changeset
292 ngx_int_t rv;
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
293 ngx_connection_t *c;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
294 ngx_stream_ssl_conf_t *sslcf;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
295
6870
0a08a8babf53 Stream: fixed handling of non-ssl sessions.
Vladimir Homutov <vl@nginx.com>
parents: 6850
diff changeset
296 if (!s->ssl) {
0a08a8babf53 Stream: fixed handling of non-ssl sessions.
Vladimir Homutov <vl@nginx.com>
parents: 6850
diff changeset
297 return NGX_OK;
0a08a8babf53 Stream: fixed handling of non-ssl sessions.
Vladimir Homutov <vl@nginx.com>
parents: 6850
diff changeset
298 }
0a08a8babf53 Stream: fixed handling of non-ssl sessions.
Vladimir Homutov <vl@nginx.com>
parents: 6850
diff changeset
299
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
300 c = s->connection;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
301
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
302 sslcf = ngx_stream_get_module_srv_conf(s, ngx_stream_ssl_module);
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
303
6870
0a08a8babf53 Stream: fixed handling of non-ssl sessions.
Vladimir Homutov <vl@nginx.com>
parents: 6850
diff changeset
304 if (c->ssl == NULL) {
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
305 c->log->action = "SSL handshaking";
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
306
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
307 if (sslcf->ssl.ctx == NULL) {
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
308 ngx_log_error(NGX_LOG_ERR, c->log, 0,
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
309 "no \"ssl_certificate\" is defined "
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
310 "in server listening on SSL port");
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
311 return NGX_ERROR;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
312 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
313
6871
1818acd8442f Stream: client SSL certificates were not checked in some cases.
Vladimir Homutov <vl@nginx.com>
parents: 6870
diff changeset
314 rv = ngx_stream_ssl_init_connection(&sslcf->ssl, c);
1818acd8442f Stream: client SSL certificates were not checked in some cases.
Vladimir Homutov <vl@nginx.com>
parents: 6870
diff changeset
315
1818acd8442f Stream: client SSL certificates were not checked in some cases.
Vladimir Homutov <vl@nginx.com>
parents: 6870
diff changeset
316 if (rv != NGX_OK) {
1818acd8442f Stream: client SSL certificates were not checked in some cases.
Vladimir Homutov <vl@nginx.com>
parents: 6870
diff changeset
317 return rv;
1818acd8442f Stream: client SSL certificates were not checked in some cases.
Vladimir Homutov <vl@nginx.com>
parents: 6870
diff changeset
318 }
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
319 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
320
6850
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
321 if (sslcf->verify) {
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
322 rc = SSL_get_verify_result(c->ssl->connection);
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
323
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
324 if (rc != X509_V_OK
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
325 && (sslcf->verify != 3 || !ngx_ssl_verify_error_optional(rc)))
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
326 {
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
327 ngx_log_error(NGX_LOG_INFO, c->log, 0,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
328 "client SSL certificate verify error: (%l:%s)",
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
329 rc, X509_verify_cert_error_string(rc));
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
330
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
331 ngx_ssl_remove_cached_session(sslcf->ssl.ctx,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
332 (SSL_get0_session(c->ssl->connection)));
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
333 return NGX_ERROR;
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
334 }
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
335
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
336 if (sslcf->verify == 1) {
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
337 cert = SSL_get_peer_certificate(c->ssl->connection);
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
338
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
339 if (cert == NULL) {
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
340 ngx_log_error(NGX_LOG_INFO, c->log, 0,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
341 "client sent no required SSL certificate");
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
342
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
343 ngx_ssl_remove_cached_session(sslcf->ssl.ctx,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
344 (SSL_get0_session(c->ssl->connection)));
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
345 return NGX_ERROR;
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
346 }
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
347
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
348 X509_free(cert);
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
349 }
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
350 }
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
351
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
352 return NGX_OK;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
353 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
354
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
355
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
356 static ngx_int_t
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
357 ngx_stream_ssl_init_connection(ngx_ssl_t *ssl, ngx_connection_t *c)
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
358 {
7008
29c6d66b83ba SSL: set TCP_NODELAY on SSL connections before handshake.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6981
diff changeset
359 ngx_int_t rc;
29c6d66b83ba SSL: set TCP_NODELAY on SSL connections before handshake.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6981
diff changeset
360 ngx_stream_session_t *s;
29c6d66b83ba SSL: set TCP_NODELAY on SSL connections before handshake.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6981
diff changeset
361 ngx_stream_ssl_conf_t *sslcf;
29c6d66b83ba SSL: set TCP_NODELAY on SSL connections before handshake.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6981
diff changeset
362 ngx_stream_core_srv_conf_t *cscf;
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
363
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
364 s = c->data;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
365
7008
29c6d66b83ba SSL: set TCP_NODELAY on SSL connections before handshake.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6981
diff changeset
366 cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module);
29c6d66b83ba SSL: set TCP_NODELAY on SSL connections before handshake.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6981
diff changeset
367
29c6d66b83ba SSL: set TCP_NODELAY on SSL connections before handshake.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6981
diff changeset
368 if (cscf->tcp_nodelay && ngx_tcp_nodelay(c) != NGX_OK) {
29c6d66b83ba SSL: set TCP_NODELAY on SSL connections before handshake.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6981
diff changeset
369 return NGX_ERROR;
29c6d66b83ba SSL: set TCP_NODELAY on SSL connections before handshake.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6981
diff changeset
370 }
29c6d66b83ba SSL: set TCP_NODELAY on SSL connections before handshake.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6981
diff changeset
371
7009
03444167a3bb Style: changed checks of ngx_ssl_create_connection() to != NGX_OK.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7008
diff changeset
372 if (ngx_ssl_create_connection(ssl, c, 0) != NGX_OK) {
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
373 return NGX_ERROR;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
374 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
375
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
376 rc = ngx_ssl_handshake(c);
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
377
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
378 if (rc == NGX_ERROR) {
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
379 return NGX_ERROR;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
380 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
381
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
382 if (rc == NGX_AGAIN) {
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
383 sslcf = ngx_stream_get_module_srv_conf(s, ngx_stream_ssl_module);
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
384
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
385 ngx_add_timer(c->read, sslcf->handshake_timeout);
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
386
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
387 c->ssl->handler = ngx_stream_ssl_handshake_handler;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
388
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
389 return NGX_AGAIN;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
390 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
391
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
392 /* rc == NGX_OK */
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
393
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
394 return NGX_OK;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
395 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
396
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
397
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
398 static void
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
399 ngx_stream_ssl_handshake_handler(ngx_connection_t *c)
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
400 {
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
401 ngx_stream_session_t *s;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
402
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
403 s = c->data;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
404
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
405 if (!c->ssl->handshaked) {
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
406 ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
407 return;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
408 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
409
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
410 if (c->read->timer_set) {
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
411 ngx_del_timer(c->read);
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
412 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
413
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
414 ngx_stream_core_run_phases(s);
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
415 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
416
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
417
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
418 static ngx_int_t
6611
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
419 ngx_stream_ssl_static_variable(ngx_stream_session_t *s,
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
420 ngx_stream_variable_value_t *v, uintptr_t data)
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
421 {
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
422 ngx_ssl_variable_handler_pt handler = (ngx_ssl_variable_handler_pt) data;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
423
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
424 size_t len;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
425 ngx_str_t str;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
426
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
427 if (s->connection->ssl) {
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
428
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
429 (void) handler(s->connection, NULL, &str);
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
430
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
431 v->data = str.data;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
432
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
433 for (len = 0; v->data[len]; len++) { /* void */ }
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
434
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
435 v->len = len;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
436 v->valid = 1;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
437 v->no_cacheable = 0;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
438 v->not_found = 0;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
439
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
440 return NGX_OK;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
441 }
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
442
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
443 v->not_found = 1;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
444
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
445 return NGX_OK;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
446 }
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
447
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
448
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
449 static ngx_int_t
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
450 ngx_stream_ssl_variable(ngx_stream_session_t *s,
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
451 ngx_stream_variable_value_t *v, uintptr_t data)
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
452 {
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
453 ngx_ssl_variable_handler_pt handler = (ngx_ssl_variable_handler_pt) data;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
454
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
455 ngx_str_t str;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
456
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
457 if (s->connection->ssl) {
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
458
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
459 if (handler(s->connection, s->connection->pool, &str) != NGX_OK) {
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
460 return NGX_ERROR;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
461 }
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
462
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
463 v->len = str.len;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
464 v->data = str.data;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
465
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
466 if (v->len) {
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
467 v->valid = 1;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
468 v->no_cacheable = 0;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
469 v->not_found = 0;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
470
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
471 return NGX_OK;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
472 }
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
473 }
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
474
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
475 v->not_found = 1;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
476
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
477 return NGX_OK;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
478 }
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
479
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
480
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
481 static ngx_int_t
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
482 ngx_stream_ssl_add_variables(ngx_conf_t *cf)
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
483 {
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
484 ngx_stream_variable_t *var, *v;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
485
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
486 for (v = ngx_stream_ssl_vars; v->name.len; v++) {
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
487 var = ngx_stream_add_variable(cf, &v->name, v->flags);
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
488 if (var == NULL) {
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
489 return NGX_ERROR;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
490 }
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
491
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
492 var->get_handler = v->get_handler;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
493 var->data = v->data;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
494 }
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
495
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
496 return NGX_OK;
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
497 }
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
498
85e7bcb37d6b Stream: SSL-related variables.
Vladimir Homutov <vl@nginx.com>
parents: 6606
diff changeset
499
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
500 static void *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
501 ngx_stream_ssl_create_conf(ngx_conf_t *cf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
502 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
503 ngx_stream_ssl_conf_t *scf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
504
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
505 scf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_ssl_conf_t));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
506 if (scf == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
507 return NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
508 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
509
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
510 /*
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
511 * set by ngx_pcalloc():
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
512 *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
513 * scf->protocols = 0;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
514 * scf->dhparam = { 0, NULL };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
515 * scf->ecdh_curve = { 0, NULL };
6850
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
516 * scf->client_certificate = { 0, NULL };
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
517 * scf->trusted_certificate = { 0, NULL };
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
518 * scf->crl = { 0, NULL };
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
519 * scf->ciphers = { 0, NULL };
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
520 * scf->shm_zone = NULL;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
521 */
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
522
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
523 scf->handshake_timeout = NGX_CONF_UNSET_MSEC;
6550
51e1f047d15d SSL: support for multiple certificates (ticket #814).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6489
diff changeset
524 scf->certificates = NGX_CONF_UNSET_PTR;
51e1f047d15d SSL: support for multiple certificates (ticket #814).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6489
diff changeset
525 scf->certificate_keys = NGX_CONF_UNSET_PTR;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
526 scf->passwords = NGX_CONF_UNSET_PTR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
527 scf->prefer_server_ciphers = NGX_CONF_UNSET;
6850
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
528 scf->verify = NGX_CONF_UNSET_UINT;
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
529 scf->verify_depth = NGX_CONF_UNSET_UINT;
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
530 scf->builtin_session_cache = NGX_CONF_UNSET;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
531 scf->session_timeout = NGX_CONF_UNSET;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
532 scf->session_tickets = NGX_CONF_UNSET;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
533 scf->session_ticket_keys = NGX_CONF_UNSET_PTR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
534
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
535 return scf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
536 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
537
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
538
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
539 static char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
540 ngx_stream_ssl_merge_conf(ngx_conf_t *cf, void *parent, void *child)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
541 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
542 ngx_stream_ssl_conf_t *prev = parent;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
543 ngx_stream_ssl_conf_t *conf = child;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
544
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
545 ngx_pool_cleanup_t *cln;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
546
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
547 ngx_conf_merge_msec_value(conf->handshake_timeout,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
548 prev->handshake_timeout, 60000);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
549
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
550 ngx_conf_merge_value(conf->session_timeout,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
551 prev->session_timeout, 300);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
552
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
553 ngx_conf_merge_value(conf->prefer_server_ciphers,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
554 prev->prefer_server_ciphers, 0);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
555
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
556 ngx_conf_merge_bitmask_value(conf->protocols, prev->protocols,
6157
b2899e7d0ef8 Disabled SSLv3 by default (ticket #653).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6115
diff changeset
557 (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
558 |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
559
6850
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
560 ngx_conf_merge_uint_value(conf->verify, prev->verify, 0);
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
561 ngx_conf_merge_uint_value(conf->verify_depth, prev->verify_depth, 1);
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
562
6550
51e1f047d15d SSL: support for multiple certificates (ticket #814).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6489
diff changeset
563 ngx_conf_merge_ptr_value(conf->certificates, prev->certificates, NULL);
51e1f047d15d SSL: support for multiple certificates (ticket #814).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6489
diff changeset
564 ngx_conf_merge_ptr_value(conf->certificate_keys, prev->certificate_keys,
51e1f047d15d SSL: support for multiple certificates (ticket #814).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6489
diff changeset
565 NULL);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
566
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
567 ngx_conf_merge_ptr_value(conf->passwords, prev->passwords, NULL);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
568
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
569 ngx_conf_merge_str_value(conf->dhparam, prev->dhparam, "");
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
570
6850
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
571 ngx_conf_merge_str_value(conf->client_certificate, prev->client_certificate,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
572 "");
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
573 ngx_conf_merge_str_value(conf->trusted_certificate,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
574 prev->trusted_certificate, "");
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
575 ngx_conf_merge_str_value(conf->crl, prev->crl, "");
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
576
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
577 ngx_conf_merge_str_value(conf->ecdh_curve, prev->ecdh_curve,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
578 NGX_DEFAULT_ECDH_CURVE);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
579
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
580 ngx_conf_merge_str_value(conf->ciphers, prev->ciphers, NGX_DEFAULT_CIPHERS);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
581
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
582
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
583 conf->ssl.log = cf->log;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
584
6550
51e1f047d15d SSL: support for multiple certificates (ticket #814).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6489
diff changeset
585 if (conf->certificates == NULL) {
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
586 return NGX_CONF_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
587 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
588
6550
51e1f047d15d SSL: support for multiple certificates (ticket #814).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6489
diff changeset
589 if (conf->certificate_keys == NULL
51e1f047d15d SSL: support for multiple certificates (ticket #814).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6489
diff changeset
590 || conf->certificate_keys->nelts < conf->certificates->nelts)
51e1f047d15d SSL: support for multiple certificates (ticket #814).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6489
diff changeset
591 {
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
592 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
593 "no \"ssl_certificate_key\" is defined "
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
594 "for certificate \"%V\"",
6550
51e1f047d15d SSL: support for multiple certificates (ticket #814).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6489
diff changeset
595 ((ngx_str_t *) conf->certificates->elts)
51e1f047d15d SSL: support for multiple certificates (ticket #814).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6489
diff changeset
596 + conf->certificates->nelts - 1);
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
597 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
598 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
599
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
600 if (ngx_ssl_create(&conf->ssl, conf->protocols, NULL) != NGX_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
601 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
602 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
603
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
604 cln = ngx_pool_cleanup_add(cf->pool, 0);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
605 if (cln == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
606 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
607 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
608
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
609 cln->handler = ngx_ssl_cleanup_ctx;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
610 cln->data = &conf->ssl;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
611
6550
51e1f047d15d SSL: support for multiple certificates (ticket #814).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6489
diff changeset
612 if (ngx_ssl_certificates(cf, &conf->ssl, conf->certificates,
51e1f047d15d SSL: support for multiple certificates (ticket #814).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6489
diff changeset
613 conf->certificate_keys, conf->passwords)
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
614 != NGX_OK)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
615 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
616 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
617 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
618
6591
04d8d1f85649 SSL: ngx_ssl_ciphers() to set list of ciphers.
Tim Taubert <tim@timtaubert.de>
parents: 6553
diff changeset
619 if (ngx_ssl_ciphers(cf, &conf->ssl, &conf->ciphers,
04d8d1f85649 SSL: ngx_ssl_ciphers() to set list of ciphers.
Tim Taubert <tim@timtaubert.de>
parents: 6553
diff changeset
620 conf->prefer_server_ciphers)
04d8d1f85649 SSL: ngx_ssl_ciphers() to set list of ciphers.
Tim Taubert <tim@timtaubert.de>
parents: 6553
diff changeset
621 != NGX_OK)
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
622 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
623 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
624 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
625
6850
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
626 if (conf->verify) {
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
627
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
628 if (conf->client_certificate.len == 0 && conf->verify != 3) {
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
629 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
630 "no ssl_client_certificate for ssl_client_verify");
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
631 return NGX_CONF_ERROR;
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
632 }
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
633
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
634 if (ngx_ssl_client_certificate(cf, &conf->ssl,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
635 &conf->client_certificate,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
636 conf->verify_depth)
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
637 != NGX_OK)
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
638 {
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
639 return NGX_CONF_ERROR;
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
640 }
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
641
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
642 if (ngx_ssl_trusted_certificate(cf, &conf->ssl,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
643 &conf->trusted_certificate,
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
644 conf->verify_depth)
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
645 != NGX_OK)
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
646 {
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
647 return NGX_CONF_ERROR;
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
648 }
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
649
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
650 if (ngx_ssl_crl(cf, &conf->ssl, &conf->crl) != NGX_OK) {
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
651 return NGX_CONF_ERROR;
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
652 }
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
653 }
41cb1b64561d Stream: client SSL certificates verification support.
Vladimir Homutov <vl@nginx.com>
parents: 6817
diff changeset
654
6115
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
655 if (ngx_ssl_dhparam(cf, &conf->ssl, &conf->dhparam) != NGX_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
656 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
657 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
658
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
659 if (ngx_ssl_ecdh_curve(cf, &conf->ssl, &conf->ecdh_curve) != NGX_OK) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
660 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
661 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
662
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
663 ngx_conf_merge_value(conf->builtin_session_cache,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
664 prev->builtin_session_cache, NGX_SSL_NONE_SCACHE);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
665
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
666 if (conf->shm_zone == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
667 conf->shm_zone = prev->shm_zone;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
668 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
669
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
670 if (ngx_ssl_session_cache(&conf->ssl, &ngx_stream_ssl_sess_id_ctx,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
671 conf->builtin_session_cache,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
672 conf->shm_zone, conf->session_timeout)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
673 != NGX_OK)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
674 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
675 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
676 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
677
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
678 ngx_conf_merge_value(conf->session_tickets,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
679 prev->session_tickets, 1);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
680
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
681 #ifdef SSL_OP_NO_TICKET
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
682 if (!conf->session_tickets) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
683 SSL_CTX_set_options(conf->ssl.ctx, SSL_OP_NO_TICKET);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
684 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
685 #endif
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
686
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
687 ngx_conf_merge_ptr_value(conf->session_ticket_keys,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
688 prev->session_ticket_keys, NULL);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
689
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
690 if (ngx_ssl_session_ticket_keys(cf, &conf->ssl, conf->session_ticket_keys)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
691 != NGX_OK)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
692 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
693 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
694 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
695
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
696 return NGX_CONF_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
697 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
698
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
699
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
700 static char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
701 ngx_stream_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
702 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
703 ngx_stream_ssl_conf_t *scf = conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
704
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
705 ngx_str_t *value;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
706
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
707 if (scf->passwords != NGX_CONF_UNSET_PTR) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
708 return "is duplicate";
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
709 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
710
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
711 value = cf->args->elts;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
712
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
713 scf->passwords = ngx_ssl_read_password_file(cf, &value[1]);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
714
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
715 if (scf->passwords == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
716 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
717 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
718
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
719 return NGX_CONF_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
720 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
721
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
722
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
723 static char *
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
724 ngx_stream_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
725 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
726 ngx_stream_ssl_conf_t *scf = conf;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
727
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
728 size_t len;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
729 ngx_str_t *value, name, size;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
730 ngx_int_t n;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
731 ngx_uint_t i, j;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
732
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
733 value = cf->args->elts;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
734
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
735 for (i = 1; i < cf->args->nelts; i++) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
736
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
737 if (ngx_strcmp(value[i].data, "off") == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
738 scf->builtin_session_cache = NGX_SSL_NO_SCACHE;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
739 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
740 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
741
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
742 if (ngx_strcmp(value[i].data, "none") == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
743 scf->builtin_session_cache = NGX_SSL_NONE_SCACHE;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
744 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
745 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
746
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
747 if (ngx_strcmp(value[i].data, "builtin") == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
748 scf->builtin_session_cache = NGX_SSL_DFLT_BUILTIN_SCACHE;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
749 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
750 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
751
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
752 if (value[i].len > sizeof("builtin:") - 1
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
753 && ngx_strncmp(value[i].data, "builtin:", sizeof("builtin:") - 1)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
754 == 0)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
755 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
756 n = ngx_atoi(value[i].data + sizeof("builtin:") - 1,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
757 value[i].len - (sizeof("builtin:") - 1));
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
758
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
759 if (n == NGX_ERROR) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
760 goto invalid;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
761 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
762
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
763 scf->builtin_session_cache = n;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
764
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
765 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
766 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
767
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
768 if (value[i].len > sizeof("shared:") - 1
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
769 && ngx_strncmp(value[i].data, "shared:", sizeof("shared:") - 1)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
770 == 0)
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
771 {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
772 len = 0;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
773
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
774 for (j = sizeof("shared:") - 1; j < value[i].len; j++) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
775 if (value[i].data[j] == ':') {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
776 break;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
777 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
778
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
779 len++;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
780 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
781
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
782 if (len == 0) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
783 goto invalid;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
784 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
785
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
786 name.len = len;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
787 name.data = value[i].data + sizeof("shared:") - 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
788
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
789 size.len = value[i].len - j - 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
790 size.data = name.data + len + 1;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
791
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
792 n = ngx_parse_size(&size);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
793
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
794 if (n == NGX_ERROR) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
795 goto invalid;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
796 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
797
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
798 if (n < (ngx_int_t) (8 * ngx_pagesize)) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
799 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
800 "session cache \"%V\" is too small",
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
801 &value[i]);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
802
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
803 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
804 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
805
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
806 scf->shm_zone = ngx_shared_memory_add(cf, &name, n,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
807 &ngx_stream_ssl_module);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
808 if (scf->shm_zone == NULL) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
809 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
810 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
811
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
812 scf->shm_zone->init = ngx_ssl_session_cache_init;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
813
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
814 continue;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
815 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
816
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
817 goto invalid;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
818 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
819
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
820 if (scf->shm_zone && scf->builtin_session_cache == NGX_CONF_UNSET) {
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
821 scf->builtin_session_cache = NGX_SSL_NO_BUILTIN_SCACHE;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
822 }
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
823
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
824 return NGX_CONF_OK;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
825
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
826 invalid:
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
827
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
828 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
829 "invalid session cache \"%V\"", &value[i]);
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
830
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
831 return NGX_CONF_ERROR;
61d7ae76647d Stream: port from NGINX+.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
832 }
6693
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
833
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
834
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
835 static ngx_int_t
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
836 ngx_stream_ssl_init(ngx_conf_t *cf)
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
837 {
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
838 ngx_stream_handler_pt *h;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
839 ngx_stream_core_main_conf_t *cmcf;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
840
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
841 cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
842
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
843 h = ngx_array_push(&cmcf->phases[NGX_STREAM_SSL_PHASE].handlers);
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
844 if (h == NULL) {
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
845 return NGX_ERROR;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
846 }
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
847
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
848 *h = ngx_stream_ssl_handler;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
849
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
850 return NGX_OK;
3908156a51fa Stream: phases.
Roman Arutyunyan <arut@nginx.com>
parents: 6611
diff changeset
851 }