@@ -94,6 +94,7 @@ groups() ->
94
94
listen_c2s_just_tls ,
95
95
listen_s2s ,
96
96
listen_s2s_tls ,
97
+ listen_s2s_cacertfile_verify ,
97
98
listen_service ,
98
99
listen_http ,
99
100
listen_http_tls ,
@@ -508,11 +509,18 @@ listen_c2s_fast_tls(_Config) ->
508
509
T = fun (Opts ) -> listen_raw (c2s , #{<<" port" >> => 5222 ,
509
510
<<" tls" >> => Opts }) end ,
510
511
P = [listen , 1 , tls ],
511
- ? cfg (P , default_c2s_tls (fast_tls ), T (#{})),
512
+ M = tls_ca_raw (),
513
+ ? cfg (P , maps :merge (default_c2s_tls (fast_tls ), tls_ca ()), T (M )),
512
514
test_fast_tls_server (P , T ),
513
- ? cfg (P ++ [mode ], tls , T (#{<<" mode" >> => <<" tls" >>})),
514
- ? err (T (#{<<" mode" >> => <<" stopttls" >>})),
515
- ? err (T (#{<<" module" >> => <<" slow_tls" >>})).
515
+ % % we do not require `cacertfile` when `verify_mode` is `none`
516
+ ? cfg (P ++ [verify_mode ], none , T (#{<<" verify_mode" >> => <<" none" >>})),
517
+ % % we require `cacertfile` when `verify_mode` is `peer` (which is the default)
518
+ ? cfg (P ++ [cacertfile ], " priv/ca.pem" , T (M #{<<" verify_mode" >> => <<" peer" >>})),
519
+ ? err ([#{reason := missing_cacertfile }], T (#{})),
520
+ ? err ([#{reason := missing_cacertfile }], T (#{<<" verify_mode" >> => <<" peer" >>})),
521
+ ? cfg (P ++ [mode ], tls , T (M #{<<" mode" >> => <<" tls" >>})),
522
+ ? err (T (M #{<<" mode" >> => <<" stopttls" >>})),
523
+ ? err (T (M #{<<" module" >> => <<" slow_tls" >>})).
516
524
517
525
listen_c2s_just_tls (_Config ) ->
518
526
T = fun (Opts ) -> listen_raw (c2s , #{<<" port" >> => 5222 ,
@@ -545,6 +553,28 @@ listen_s2s_tls(_Config) ->
545
553
? cfg (P , default_config ([listen , s2s , tls ]), T (#{})),
546
554
test_fast_tls_server (P , T ).
547
555
556
+ listen_s2s_cacertfile_verify (_Config ) ->
557
+ T = fun (UseStartTLS , Opts ) ->
558
+ maps :merge (#{<<" s2s" >> => #{<<" use_starttls" >> => UseStartTLS }},
559
+ listen_raw (s2s , #{<<" port" >> => 5269 , <<" tls" >> => Opts })) end ,
560
+ P = [listen , 1 , tls ],
561
+ ConfigWithCA = maps :merge (default_config ([listen , s2s , tls ]), tls_ca ()),
562
+ % % no checking of `cacertfile` when `use_starttls` is `false` or `optional`
563
+ ? cfg (P , default_config ([listen , s2s , tls ]), T (<<" false" >>, #{})),
564
+ ? cfg (P , default_config ([listen , s2s , tls ]), T (<<" optional" >>, #{})),
565
+ % % `cacertfile` is required when `use_starttls` is `required` or `optional`
566
+ ? cfg (P , ConfigWithCA , T (<<" required" >>, tls_ca_raw ())),
567
+ ? cfg (P , ConfigWithCA , T (<<" required_trusted" >>, tls_ca_raw ())),
568
+ ? err ([#{reason := missing_cacertfile }], T (<<" required" >>, #{})),
569
+ ? err ([#{reason := missing_cacertfile }], T (<<" required_trusted" >>, #{})),
570
+ % % setting `verify_mode` to `none` turns off `cacertfile` validation
571
+ VerifyModeNone = #{verify_mode => none },
572
+ VerifyModeNoneRaw = #{<<" verify_mode" >> => <<" none" >>},
573
+ ConfigWithVerifyModeNone = maps :merge (default_config ([listen , s2s , tls ]),
574
+ #{verify_mode => none }),
575
+ ? cfg (P , ConfigWithVerifyModeNone , T (<<" required" >>, VerifyModeNoneRaw )),
576
+ ? cfg (P , ConfigWithVerifyModeNone , T (<<" required_trusted" >>, VerifyModeNoneRaw )).
577
+
548
578
listen_service (_Config ) ->
549
579
T = fun (Opts ) -> listen_raw (service , maps :merge (#{<<" port" >> => 8888 ,
550
580
<<" password" >> => <<" secret" >>}, Opts ))
@@ -1197,12 +1227,13 @@ test_just_tls_client_sni(ParentP, ParentT) ->
1197
1227
1198
1228
test_fast_tls_server (P , T ) ->
1199
1229
? cfg (P ++ [verify_mode ], none , T (#{<<" verify_mode" >> => <<" none" >>})),
1200
- ? cfg (P ++ [certfile ], " priv/cert.pem" , T (#{<<" certfile" >> => <<" priv/cert.pem" >>})),
1201
- ? cfg (P ++ [cacertfile ], " priv/ca.pem" , T (tls_ca_raw ())),
1230
+ M = tls_ca_raw (),
1231
+ ? cfg (P ++ [certfile ], " priv/cert.pem" , T (M #{<<" certfile" >> => <<" priv/cert.pem" >>})),
1232
+ ? cfg (P ++ [cacertfile ], " priv/ca.pem" , T (M )),
1202
1233
? cfg (P ++ [ciphers ], " TLS_AES_256_GCM_SHA384" ,
1203
- T (#{<<" ciphers" >> => <<" TLS_AES_256_GCM_SHA384" >>})),
1204
- ? cfg (P ++ [dhfile ], " priv/dh.pem" , T (#{<<" dhfile" >> => <<" priv/dh.pem" >>})),
1205
- ? cfg (P ++ [protocol_options ], [" nosslv2" ], T (#{<<" protocol_options" >> => [<<" nosslv2" >>]})),
1234
+ T (M #{<<" ciphers" >> => <<" TLS_AES_256_GCM_SHA384" >>})),
1235
+ ? cfg (P ++ [dhfile ], " priv/dh.pem" , T (M #{<<" dhfile" >> => <<" priv/dh.pem" >>})),
1236
+ ? cfg (P ++ [protocol_options ], [" nosslv2" ], T (M #{<<" protocol_options" >> => [<<" nosslv2" >>]})),
1206
1237
? err (T (#{<<" verify_mode" >> => <<" selfsigned_peer" >>})), % value only for just_tls
1207
1238
? err (T (#{<<" crl_files" >> => [<<" priv/cert.pem" >>]})), % option only for just_tls
1208
1239
? err (T (#{<<" certfile" >> => <<" no_such_file.pem" >>})),
0 commit comments