@@ -47,10 +47,10 @@ tcp_to_tls(TCPSocket, Options) ->
47
47
% and outgoing pools use Erlang SSL directly
48
48
% Do not set `fail_if_no_peer_cert_opt` for SSL client
49
49
% as it is a server only option.
50
- {Ref , SSLOpts } = format_opts_with_ref (Options , false ),
50
+ {Ref , SSLOpts } = format_opts_with_ref (Options , client ),
51
51
{Ref , ssl :connect (TCPSocket , SSLOpts )};
52
52
#{} ->
53
- {Ref , SSLOpts } = format_opts_with_ref (Options , fail_if_no_peer_cert ),
53
+ {Ref , SSLOpts } = format_opts_with_ref (Options , server ),
54
54
{Ref , ssl :handshake (TCPSocket , SSLOpts , 5000 )}
55
55
end ,
56
56
VerifyResults = receive_verify_results (Ref1 ),
@@ -108,45 +108,45 @@ close(#tls_socket{ssl_socket = SSLSocket}) ->
108
108
% % The `disconnect_on_failure' option is expected to be unset or true
109
109
-spec make_ssl_opts (mongoose_tls :options ()) -> [ssl :tls_option ()].
110
110
make_ssl_opts (#{verify_mode := Mode } = Opts ) ->
111
- SslOpts = format_opts (Opts , false ),
111
+ SslOpts = format_opts (Opts , client ),
112
112
[{verify_fun , verify_fun (Mode )} | SslOpts ].
113
113
114
114
% % @doc Prepare SSL options for direct use of ssl:handshake/2 (server side)
115
115
% % The `disconnect_on_failure' option is expected to be unset or true
116
116
-spec make_cowboy_ssl_opts (mongoose_tls :options ()) -> [ssl :tls_option ()].
117
117
make_cowboy_ssl_opts (#{verify_mode := Mode } = Opts ) ->
118
- SslOpts = format_opts (Opts , fail_if_no_peer_cert ),
118
+ SslOpts = format_opts (Opts , server ),
119
119
[{verify_fun , verify_fun (Mode )} | SslOpts ].
120
120
121
121
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
122
122
% % local functions
123
123
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
124
124
125
- format_opts_with_ref (Opts , FailIfNoPeerCert ) ->
126
- SslOpts0 = format_opts (Opts , FailIfNoPeerCert ),
125
+ format_opts_with_ref (Opts , ClientOrServer ) ->
126
+ SslOpts0 = format_opts (Opts , ClientOrServer ),
127
127
{Ref , VerifyFun } = verify_fun_opt (Opts ),
128
128
SslOpts = [{verify_fun , VerifyFun } | SslOpts0 ],
129
129
{Ref , SslOpts }.
130
130
131
- format_opts (Opts , FailIfNoPeerCert ) ->
131
+ format_opts (Opts , ClientOrServer ) ->
132
132
SslOpts0 = maps :to_list (maps :with (ssl_option_keys (), Opts )),
133
- SslOpts1 = sni_opts (SslOpts0 , Opts ),
134
- SslOpts2 = verify_opts (SslOpts1 , Opts ),
135
- SslOpts3 = hibernate_opts (SslOpts2 , Opts ),
136
- fail_if_no_peer_cert_opts (SslOpts3 , Opts , FailIfNoPeerCert ).
133
+ SslOpts1 = verify_opts (SslOpts0 , Opts ),
134
+ SslOpts2 = hibernate_opts (SslOpts1 , Opts ),
135
+ case ClientOrServer of
136
+ client -> sni_opts (SslOpts2 , Opts );
137
+ server -> fail_if_no_peer_cert_opts (SslOpts2 , Opts )
138
+ end .
137
139
138
140
ssl_option_keys () ->
139
141
[certfile , cacertfile , ciphers , keyfile , password , versions , dhfile ].
140
142
141
143
% % accept empty peer certificate if explicitly requested not to fail
142
- fail_if_no_peer_cert_opts (Opts , #{}, false ) ->
143
- [{fail_if_no_peer_cert , false } | Opts ];
144
- fail_if_no_peer_cert_opts (Opts , #{disconnect_on_failure := false }, _ ) ->
144
+ fail_if_no_peer_cert_opts (Opts , #{disconnect_on_failure := false }) ->
145
145
[{fail_if_no_peer_cert , false } | Opts ];
146
- fail_if_no_peer_cert_opts (Opts , #{verify_mode := Mode }, _ )
146
+ fail_if_no_peer_cert_opts (Opts , #{verify_mode := Mode })
147
147
when Mode =:= peer ; Mode =:= selfsigned_peer ->
148
148
[{fail_if_no_peer_cert , true } | Opts ];
149
- fail_if_no_peer_cert_opts (Opts , #{}, _ ) ->
149
+ fail_if_no_peer_cert_opts (Opts , #{}) ->
150
150
[{fail_if_no_peer_cert , false } | Opts ].
151
151
152
152
hibernate_opts (Opts , #{hibernate_after := Timeout }) ->
0 commit comments