blob: 49ee8c0ac5f544bebce666d47e3a192c1124c6d2 [file] [log] [blame]
Remi Tricot-Le Bretond12e13a2021-10-11 15:34:14 +02001#REGTEST_TYPE=devel
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +02002
3# This reg-test checks that the connection and SSL sample fetches related to
4# errors are functioning properly. It also tests the proper behaviour of the
Remi Tricot-Le Breton1ac65f82021-10-11 15:34:11 +02005# default HTTPS log format and of the error-log-format option which allows to
6# define a specific log format used only in case of connection error (otherwise
7# a line following the configured log-format is output).
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +02008#
9# It works by sending request through three different paths, one using a custom
10# log-format line that contains the connection error and SSL handshake error
11# sample fetches, one using the default HTTPS log-format and one using the
12# legacy error log format.
13#
14# The output log lines are caught by syslog blocks (one for each path) and
15# compared to an expected format.
16# Since the syslog is not by design synchronized with the Varnish clients and
17# servers, synchronization is achieved through barriers, which ensure that
18# syslog messages arrive in the right order.
19#
Remi Tricot-Le Breton1ac65f82021-10-11 15:34:11 +020020# In order to ensure that the log line raised in case of connection error if an
21# error-log-format is defined still follows the log-separate-error option, the
22# log lines raised by the https_fmt_lst listener will be sent to two separate
23# syslog servers.
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +020024#
25
26varnishtest "Test the connection and SSL error fetches."
27feature cmd "$HAPROXY_PROGRAM -cc 'version_atleast(2.5-dev2)'"
Remi Tricot-Le Bretond12e13a2021-10-11 15:34:14 +020028feature cmd "$HAPROXY_PROGRAM -cc 'feature(OPENSSL) && ssllib_name_startswith(OpenSSL)'"
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +020029feature cmd "command -v socat"
30feature ignore_unknown_macro
31
Remi Tricot-Le Bretonb061fb32021-09-01 15:52:16 +020032server s1 -repeat 4 {
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +020033 rxreq
34 txresp
35} -start
36
37barrier b1 cond 4 -cyclic
Remi Tricot-Le Bretonb061fb32021-09-01 15:52:16 +020038barrier b2 cond 2 -cyclic
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +020039
40
41syslog Slg_cust_fmt -level info {
42 recv
Remi Tricot-Le Breton74f6ab62021-08-19 18:06:30 +020043 expect ~ ".*conn_status:\"0:Success\" hsk_err:\"0:-\" CN=\"/C=FR/O=HAProxy Technologies/CN=Client\",serial=1007,hash=063DCC2E6A9159E66994B325D6D2EF3D17A75B6F"
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +020044
45 barrier b1 sync
46
47 recv
Remi Tricot-Le Bretond266cda2021-10-11 15:34:13 +020048 expect ~ "ERROR.*conn_status:\"30:SSL client CA chain cannot be verified\" hsk_err:\"134:.*:certificate verify failed\" CN=\"/C=FR/O=HAProxy Technologies/CN=Client\",serial=1007,hash=063DCC2E6A9159E66994B325D6D2EF3D17A75B6F"
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +020049
50 barrier b1 sync
51
52 recv
Remi Tricot-Le Bretond266cda2021-10-11 15:34:13 +020053 expect ~ "ERROR.*conn_status:\"31:SSL client certificate not trusted\" hsk_err:\"134:.*:certificate verify failed\" CN=\"/C=FR/O=HAProxy Technologies/CN=Client\",serial=1007,hash=063DCC2E6A9159E66994B325D6D2EF3D17A75B6F"
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +020054
55 barrier b1 sync
56
Remi Tricot-Le Breton74f6ab62021-08-19 18:06:30 +020057 # In case of an error occuring before the certificate verification process,
58 # the client certificate chain is never parsed and verified so we can't
59 # have information about the client's certificate.
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +020060 recv
Remi Tricot-Le Bretond266cda2021-10-11 15:34:13 +020061 expect ~ "ERROR.*conn_status:\"34:SSL handshake failure\" hsk_err:\"193:.*:no shared cipher\" CN=\"\",serial=-,hash=-"
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +020062} -start
63
64syslog Slg_https_fmt -level info {
65 recv
66 expect ~ ".*https_logfmt_ssl_lst~ https_logfmt_ssl_lst/s1.*0/0000000000000000/0/0 TLSv1.3/TLS_AES_256_GCM_SHA384"
67
68 barrier b1 sync
69} -start
70
71syslog Slg_https_fmt_err -level info {
72 recv
Remi Tricot-Le Bretond266cda2021-10-11 15:34:13 +020073 expect ~ "ERROR.*https_logfmt_ssl_lst~ https_logfmt_ssl_lst/<NOSRV>.*30/0000000000000086/0/2 TLSv1.3/TLS_AES_256_GCM_SHA384"
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +020074
75 barrier b1 sync
76
77 recv
Remi Tricot-Le Bretond266cda2021-10-11 15:34:13 +020078 expect ~ "ERROR.*https_logfmt_ssl_lst~ https_logfmt_ssl_lst/<NOSRV>.*31/0000000000000086/20/0 TLSv1.3/TLS_AES_256_GCM_SHA384"
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +020079
80 barrier b1 sync
81
82 recv
Remi Tricot-Le Bretond266cda2021-10-11 15:34:13 +020083 expect ~ "ERROR.*https_logfmt_ssl_lst~ https_logfmt_ssl_lst/<NOSRV>.*34/00000000000000C1/0/0 TLSv1.3/\\(NONE\\)"
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +020084} -start
85
86syslog Slg_logconnerror -level info {
87 recv
88 expect ~ ".*logconnerror_ssl_lst~ logconnerror_ssl_lst/s1"
89
90 barrier b1 sync
91
92 recv
93 expect ~ ".*logconnerror_ssl_lst/1: SSL client CA chain cannot be verified"
94
95 barrier b1 sync
96
97 recv
98 expect ~ ".*logconnerror_ssl_lst/1: SSL client certificate not trusted"
99
100 barrier b1 sync
101
102 recv
103 expect ~ ".*logconnerror_ssl_lst/1: SSL handshake failure"
104} -start
105
Remi Tricot-Le Bretonb061fb32021-09-01 15:52:16 +0200106syslog Slg_bcknd -level info {
107 recv
Remi Tricot-Le Bretond266cda2021-10-11 15:34:13 +0200108 expect ~ ".*bc_conn_err:0:\"Success\" ssl_bc_err:0:"
Remi Tricot-Le Bretonb061fb32021-09-01 15:52:16 +0200109
110 barrier b2 sync
111
112 recv
Remi Tricot-Le Bretond266cda2021-10-11 15:34:13 +0200113 expect ~ ".*bc_conn_err:34:\"SSL handshake failure\" ssl_bc_err:134:.*:certificate verify failed"
Remi Tricot-Le Bretonb061fb32021-09-01 15:52:16 +0200114
115 barrier b2 sync
116
117 recv
Remi Tricot-Le Bretond266cda2021-10-11 15:34:13 +0200118 expect ~ ".*bc_conn_err:32:\"Server presented an SSL certificate different from the configured one\" ssl_bc_err:134:.*:certificate verify failed"
Remi Tricot-Le Bretonb061fb32021-09-01 15:52:16 +0200119
120 barrier b2 sync
121
122 # Verify errors on the server side cannot be caught through those backend fetches yet
123 recv
Remi Tricot-Le Bretond266cda2021-10-11 15:34:13 +0200124 expect ~ ".*bc_conn_err:0:\"Success\" ssl_bc_err:0:"
Remi Tricot-Le Bretonb061fb32021-09-01 15:52:16 +0200125
126 barrier b2 sync
127
128 recv
Remi Tricot-Le Bretond266cda2021-10-11 15:34:13 +0200129 expect ~ ".*bc_conn_err:34:\"SSL handshake failure\" ssl_bc_err:1040:.*:sslv3 alert handshake failure"
Remi Tricot-Le Bretonb061fb32021-09-01 15:52:16 +0200130
131 barrier b2 sync
132
133 recv
Remi Tricot-Le Bretond266cda2021-10-11 15:34:13 +0200134 expect ~ ".*bc_conn_err:34:\"SSL handshake failure\" ssl_bc_err:1040:.*:sslv3 alert handshake failure"
Remi Tricot-Le Bretonb061fb32021-09-01 15:52:16 +0200135} -start
136
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +0200137
138haproxy h1 -conf {
139 global
140 tune.ssl.default-dh-param 2048
Marcin Deranek310a2602021-07-13 19:04:24 +0200141 tune.ssl.capture-buffer-size 1
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +0200142 stats socket "${tmpdir}/h1/stats" level admin
Remi Tricot-Le Bretond266cda2021-10-11 15:34:13 +0200143 .if openssl_version_atleast(3.0.0)
144 set-var proc.ssl_error_mask str(7FFFFF),hex2i
145 .else
146 set-var proc.ssl_error_mask str(FFF),hex2i
147 .endif
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +0200148
149 defaults
150 timeout connect 100ms
151 timeout client 1s
152 timeout server 1s
153 retries 0
154
155 listen clear_lst
156 bind "fd@${clearlst}"
157 default-server ssl crt ${testdir}/set_cafile_client.pem ca-file ${testdir}/set_cafile_interCA2.crt verify none no-ssl-reuse
158
159 balance roundrobin
160 server cust_fmt "${tmpdir}/cust_logfmt_ssl.sock"
161 server https_fmt "${tmpdir}/https_logfmt_ssl.sock"
162 server logconnerror "${tmpdir}/logconnerror_ssl.sock"
163
164
165 listen clear_wrong_ciphers_lst
166 bind "fd@${wrongcipherslst}"
167 default-server ssl crt ${testdir}/set_cafile_client.pem ca-file ${testdir}/set_cafile_interCA2.crt verify none no-ssl-reuse ciphersuites "TLS_AES_128_GCM_SHA256"
168
169 balance roundrobin
170 server cust_fmt "${tmpdir}/cust_logfmt_ssl.sock"
171 server https_fmt "${tmpdir}/https_logfmt_ssl.sock"
172 server logconnerror "${tmpdir}/logconnerror_ssl.sock"
173
174
Remi Tricot-Le Breton1fe0fad2021-09-29 18:56:52 +0200175 # This listener will be used to test backend fetches (bc_conn_err and ssl_bc_err)
Remi Tricot-Le Bretonb061fb32021-09-01 15:52:16 +0200176 listen clear_backend_errors_lst
177 bind "fd@${backenderrorslst}"
178 log ${Slg_bcknd_addr}:${Slg_bcknd_port} local0
Remi Tricot-Le Bretond266cda2021-10-11 15:34:13 +0200179 log-format "bc_conn_err:%[bc_conn_err]:%{+Q}[bc_conn_err_str]\ ssl_bc_err:%[ssl_bc_err,and(proc.ssl_error_mask)]:%{+Q}[ssl_bc_err_str]"
180 error-log-format "ERROR bc_conn_err:%[bc_conn_err]:%{+Q}[bc_conn_err_str]\ ssl_bc_err:%[ssl_bc_err,and(proc.ssl_error_mask)]:%[ssl_bc_err_str]"
Remi Tricot-Le Bretonb061fb32021-09-01 15:52:16 +0200181
182 balance roundrobin
183 server no_err "${tmpdir}/no_err_ssl.sock" ssl crt ${testdir}/set_cafile_client.pem ca-file ${testdir}/set_cafile_interCA2.crt verify required
184 server srv_cert_rejected "${tmpdir}/srv_rejected_ssl.sock" ssl crt ${testdir}/set_cafile_client.pem ca-file ${testdir}/set_cafile_interCA1.crt verify required
185 server mismatch_frontend "${tmpdir}/mismatch_fe_ssl.sock" ssl crt ${testdir}/set_cafile_client.pem ca-file ${testdir}/set_cafile_interCA2.crt verify required verifyhost str(toto)
186 server clt_cert_rejected "${tmpdir}/rejected_ssl.sock" ssl crt ${testdir}/set_cafile_client.pem ca-file ${testdir}/set_cafile_interCA2.crt verify none
187 server wrong_ciphers "${tmpdir}/wrong_ciphers_ssl.sock" ssl verify none crt ${testdir}/client1.pem ca-file ${testdir}/ca-auth.crt force-tlsv12 ciphers "aECDSA"
188 server wrong_ciphers_tls13 "${tmpdir}/wrong_ciphers_tls13_ssl.sock" ssl verify none crt ${testdir}/client1.pem ca-file ${testdir}/ca-auth.crt ciphersuites "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256" force-tlsv13
189
190
191
192
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +0200193 listen cust_logfmt_ssl_lst
194 log ${Slg_cust_fmt_addr}:${Slg_cust_fmt_port} local0
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +0200195 mode http
Remi Tricot-Le Breton1fe0fad2021-09-29 18:56:52 +0200196 log-format "conn_status:\"%[fc_conn_err]:%[fc_conn_err_str]\" hsk_err:\"%[ssl_fc_err]:%[ssl_fc_err_str]\" CN=%{+Q}[ssl_c_s_dn],serial=%[ssl_c_serial,hex],hash=%[ssl_c_sha1,hex]"
Remi Tricot-Le Bretond266cda2021-10-11 15:34:13 +0200197 error-log-format "ERROR conn_status:\"%[fc_conn_err]:%[fc_conn_err_str]\" hsk_err:\"%[ssl_fc_err,and(proc.ssl_error_mask)]:%[ssl_fc_err_str]\" CN=%{+Q}[ssl_c_s_dn],serial=%[ssl_c_serial,hex],hash=%[ssl_c_sha1,hex]"
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +0200198 bind "${tmpdir}/cust_logfmt_ssl.sock" ssl crt ${testdir}/set_cafile_server.pem ca-verify-file ${testdir}/set_cafile_rootCA.crt ca-file ${testdir}/set_cafile_interCA1.crt verify required ciphersuites "TLS_AES_256_GCM_SHA384"
199 server s1 ${s1_addr}:${s1_port}
200
201 listen https_logfmt_ssl_lst
202 log ${Slg_https_fmt_addr}:${Slg_https_fmt_port} local0 info
203 log ${Slg_https_fmt_err_addr}:${Slg_https_fmt_err_port} local0 err info
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +0200204 option log-separate-errors
205 mode http
206 option httpslog
Remi Tricot-Le Bretond266cda2021-10-11 15:34:13 +0200207 error-log-format "ERROR %ci:%cp [%tr] %ft %b/%s %TR/%Tw/%Tc/%Tr/%Ta %ST %B %CC %CS %tsc %ac/%fc/%bc/%sc/%rc %sq/%bq %hr %hs %{+Q}r %[fc_conn_err]/%[ssl_fc_err,and(proc.ssl_error_mask),hex]/%[ssl_c_err]/%[ssl_c_ca_err] %sslv/%sslc"
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +0200208 bind "${tmpdir}/https_logfmt_ssl.sock" ssl crt ${testdir}/set_cafile_server.pem ca-verify-file ${testdir}/set_cafile_rootCA.crt ca-file ${testdir}/set_cafile_interCA1.crt verify required ciphersuites "TLS_AES_256_GCM_SHA384"
209 server s1 ${s1_addr}:${s1_port}
210
211 listen logconnerror_ssl_lst
212 log ${Slg_logconnerror_addr}:${Slg_logconnerror_port} local0 info
213 mode http
214 option httplog
215 bind "${tmpdir}/logconnerror_ssl.sock" ssl crt ${testdir}/set_cafile_server.pem ca-verify-file ${testdir}/set_cafile_rootCA.crt ca-file ${testdir}/set_cafile_interCA1.crt verify required ciphersuites "TLS_AES_256_GCM_SHA384"
216 server s1 ${s1_addr}:${s1_port}
217
Remi Tricot-Le Bretonb061fb32021-09-01 15:52:16 +0200218
219 # The following listeners allow to test backend error fetches
220 listen no_backend_err_ssl_lst
221 bind "${tmpdir}/no_err_ssl.sock" ssl crt ${testdir}/set_cafile_server.pem ca-file ${testdir}/set_cafile_interCA2.crt verify none
222 server s1 ${s1_addr}:${s1_port}
223
224 listen srv_rejected_ssl_lst
225 bind "${tmpdir}/srv_rejected_ssl.sock" ssl crt ${testdir}/set_cafile_server.pem ca-file ${testdir}/set_cafile_interCA2.crt verify none
226 server s1 ${s1_addr}:${s1_port}
227
228 listen mismatch_fe_ssl_lst
229 bind "${tmpdir}/mismatch_fe_ssl.sock" ssl crt ${testdir}/set_cafile_server.pem ca-file ${testdir}/set_cafile_interCA2.crt verify none
230 server s1 ${s1_addr}:${s1_port}
231
232 listen rejected_clt_ssl_lst
233 bind "${tmpdir}/rejected_ssl.sock" ssl crt ${testdir}/set_cafile_server.pem ca-file ${testdir}/set_cafile_interCA2.crt verify required
234 server s1 ${s1_addr}:${s1_port}
235
236 listen wrong_ciphers_ssl_lst
237 bind "${tmpdir}/wrong_ciphers_ssl.sock" ssl crt ${testdir}/common.pem ca-file ${testdir}/ca-auth.crt verify none force-tlsv12 ciphers "kRSA"
238 server s1 ${s1_addr}:${s1_port}
239
240 listen wrong_ciphers_tls13_ssl_lst
241 bind "${tmpdir}/wrong_ciphers_tls13_ssl.sock" ssl crt ${testdir}/common.pem ca-file ${testdir}/ca-auth.crt verify none force-tlsv13 ciphersuites "TLS_AES_128_GCM_SHA256"
242 server s1 ${s1_addr}:${s1_port}
243
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +0200244} -start
245
246
247# The three following requests should all succeed
248client c1 -connect ${h1_clearlst_sock} {
249 txreq
250 rxresp
251 expect resp.status == 200
252} -run
253
254client c2 -connect ${h1_clearlst_sock} {
255 txreq
256 rxresp
257 expect resp.status == 200
258} -run
259
260client c3 -connect ${h1_clearlst_sock} {
261 txreq
262 rxresp
263 expect resp.status == 200
264} -run
265
266
267barrier b1 sync
268
269
270# Change the root CA in the frontends
271shell {
272 printf "set ssl ca-file ${testdir}/set_cafile_rootCA.crt <<\n$(cat ${testdir}/set_cafile_interCA1.crt)\n\n" | socat "${tmpdir}/h1/stats" -
273 echo "commit ssl ca-file ${testdir}/set_cafile_rootCA.crt" | socat "${tmpdir}/h1/stats" -
274}
275
276client c4 -connect ${h1_clearlst_sock} {
277 txreq
278} -run
279
280client c5 -connect ${h1_clearlst_sock} {
281 txreq
282} -run
283
284client c6 -connect ${h1_clearlst_sock} {
285 txreq
286} -run
287
288barrier b1 sync
289
290
291
292# Restore the root CA
293shell {
294 printf "set ssl ca-file ${testdir}/set_cafile_rootCA.crt <<\n$(cat ${testdir}/set_cafile_rootCA.crt)\n\n" | socat "${tmpdir}/h1/stats" -
295 echo "commit ssl ca-file ${testdir}/set_cafile_rootCA.crt" | socat "${tmpdir}/h1/stats" -
296}
297
298# Change the intermediate CA in the frontends
299shell {
300 printf "set ssl ca-file ${testdir}/set_cafile_interCA1.crt <<\n$(cat ${testdir}/set_cafile_interCA2.crt)\n\n" | socat "${tmpdir}/h1/stats" -
301 echo "commit ssl ca-file ${testdir}/set_cafile_interCA1.crt" | socat "${tmpdir}/h1/stats" -
302}
303
304client c7 -connect ${h1_clearlst_sock} {
305 txreq
306} -run
307
308client c8 -connect ${h1_clearlst_sock} {
309 txreq
310} -run
311
312client c9 -connect ${h1_clearlst_sock} {
313 txreq
314} -run
315
316barrier b1 sync
317
318
319# Restore the intermediate CA in the frontends
320shell {
321 printf "set ssl ca-file ${testdir}/set_cafile_interCA1.crt <<\n$(cat ${testdir}/set_cafile_interCA1.crt)\n\n" | socat "${tmpdir}/h1/stats" -
322 echo "commit ssl ca-file ${testdir}/set_cafile_interCA1.crt" | socat "${tmpdir}/h1/stats" -
323}
324
325# "No shared cipher" errors
326client c10 -connect ${h1_wrongcipherslst_sock} {
327 txreq
328} -run
329client c11 -connect ${h1_wrongcipherslst_sock} {
330 txreq
331} -run
332client c12 -connect ${h1_wrongcipherslst_sock} {
333 txreq
334} -run
335
Remi Tricot-Le Bretonb061fb32021-09-01 15:52:16 +0200336
337shell {
338 printf "set ssl ca-file ${testdir}/set_cafile_interCA2.crt <<\n$(cat ${testdir}/set_cafile_interCA2.crt)\n$(cat ${testdir}/set_cafile_rootCA.crt)\n\n" | socat "${tmpdir}/h1/stats" -
339 echo "commit ssl ca-file ${testdir}/set_cafile_interCA2.crt" | socat "${tmpdir}/h1/stats" -
340}
341
342client c13 -connect ${h1_backenderrorslst_sock} {
343 txreq
344 rxresp
345 expect resp.status == 200
346} -run
347barrier b2 sync
348client c14 -connect ${h1_backenderrorslst_sock} {
349 txreq
350} -run
351barrier b2 sync
352client c15 -connect ${h1_backenderrorslst_sock} {
353 txreq
354} -run
355barrier b2 sync
356client c16 -connect ${h1_backenderrorslst_sock} {
357 txreq
358} -run
359barrier b2 sync
360client c17 -connect ${h1_backenderrorslst_sock} {
361 txreq
362} -run
363barrier b2 sync
364client c18 -connect ${h1_backenderrorslst_sock} {
365 txreq
366} -run
367
Remi Tricot-Le Breton54f63832021-07-29 09:45:54 +0200368syslog Slg_cust_fmt -wait
369syslog Slg_https_fmt -wait
370syslog Slg_https_fmt_err -wait
371syslog Slg_logconnerror -wait
Remi Tricot-Le Bretonb061fb32021-09-01 15:52:16 +0200372syslog Slg_bcknd -wait