Merge pull request #5811 from zmstone/fix-dynamic-resolution-for-tlsv1.3
fix(schema): check tlsv1.3 availability
This commit is contained in:
commit
7c7892f096
|
@ -198,7 +198,7 @@ listeners.ssl.default {
|
||||||
ssl.certfile = "{{ platform_etc_dir }}/certs/cert.pem"
|
ssl.certfile = "{{ platform_etc_dir }}/certs/cert.pem"
|
||||||
ssl.cacertfile = "{{ platform_etc_dir }}/certs/cacert.pem"
|
ssl.cacertfile = "{{ platform_etc_dir }}/certs/cacert.pem"
|
||||||
|
|
||||||
ssl.versions = ["tlsv1.3", "tlsv1.2", "tlsv1.1", "tlsv1"]
|
# ssl.versions = ["tlsv1.3", "tlsv1.2", "tlsv1.1", "tlsv1"]
|
||||||
# TLS 1.3: "TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256,TLS_CHACHA20_POLY1305_SHA256,TLS_AES_128_CCM_SHA256,TLS_AES_128_CCM_8_SHA256"
|
# TLS 1.3: "TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256,TLS_CHACHA20_POLY1305_SHA256,TLS_AES_128_CCM_SHA256,TLS_AES_128_CCM_8_SHA256"
|
||||||
# TLS 1-1.2 "ECDHE-ECDSA-AES256-GCM-SHA384,ECDHE-RSA-AES256-GCM-SHA384,ECDHE-ECDSA-AES256-SHA384,ECDHE-RSA-AES256-SHA384,ECDHE-ECDSA-DES-CBC3-SHA,ECDH-ECDSA-AES256-GCM-SHA384,ECDH-RSA-AES256-GCM-SHA384,ECDH-ECDSA-AES256-SHA384,ECDH-RSA-AES256-SHA384,DHE-DSS-AES256-GCM-SHA384,DHE-DSS-AES256-SHA256,AES256-GCM-SHA384,AES256-SHA256,ECDHE-ECDSA-AES128-GCM-SHA256,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES128-SHA256,ECDHE-RSA-AES128-SHA256,ECDH-ECDSA-AES128-GCM-SHA256,ECDH-RSA-AES128-GCM-SHA256,ECDH-ECDSA-AES128-SHA256,ECDH-RSA-AES128-SHA256,DHE-DSS-AES128-GCM-SHA256,DHE-DSS-AES128-SHA256,AES128-GCM-SHA256,AES128-SHA256,ECDHE-ECDSA-AES256-SHA,ECDHE-RSA-AES256-SHA,DHE-DSS-AES256-SHA,ECDH-ECDSA-AES256-SHA,ECDH-RSA-AES256-SHA,AES256-SHA,ECDHE-ECDSA-AES128-SHA,ECDHE-RSA-AES128-SHA,DHE-DSS-AES128-SHA,ECDH-ECDSA-AES128-SHA,ECDH-RSA-AES128-SHA,AES128-SHA"
|
# TLS 1-1.2 "ECDHE-ECDSA-AES256-GCM-SHA384,ECDHE-RSA-AES256-GCM-SHA384,ECDHE-ECDSA-AES256-SHA384,ECDHE-RSA-AES256-SHA384,ECDHE-ECDSA-DES-CBC3-SHA,ECDH-ECDSA-AES256-GCM-SHA384,ECDH-RSA-AES256-GCM-SHA384,ECDH-ECDSA-AES256-SHA384,ECDH-RSA-AES256-SHA384,DHE-DSS-AES256-GCM-SHA384,DHE-DSS-AES256-SHA256,AES256-GCM-SHA384,AES256-SHA256,ECDHE-ECDSA-AES128-GCM-SHA256,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES128-SHA256,ECDHE-RSA-AES128-SHA256,ECDH-ECDSA-AES128-GCM-SHA256,ECDH-RSA-AES128-GCM-SHA256,ECDH-ECDSA-AES128-SHA256,ECDH-RSA-AES128-SHA256,DHE-DSS-AES128-GCM-SHA256,DHE-DSS-AES128-SHA256,AES128-GCM-SHA256,AES128-SHA256,ECDHE-ECDSA-AES256-SHA,ECDHE-RSA-AES256-SHA,DHE-DSS-AES256-SHA,ECDH-ECDSA-AES256-SHA,ECDH-RSA-AES256-SHA,AES256-SHA,ECDHE-ECDSA-AES128-SHA,ECDHE-RSA-AES128-SHA,DHE-DSS-AES128-SHA,ECDH-ECDSA-AES128-SHA,ECDH-RSA-AES128-SHA,AES128-SHA"
|
||||||
# PSK: "PSK-AES128-CBC-SHA,PSK-AES256-CBC-SHA,PSK-3DES-EDE-CBC-SHA,PSK-RC4-SHA"
|
# PSK: "PSK-AES128-CBC-SHA,PSK-AES256-CBC-SHA,PSK-3DES-EDE-CBC-SHA,PSK-RC4-SHA"
|
||||||
|
@ -1350,7 +1350,7 @@ example_common_ssl_options {
|
||||||
## Default: true
|
## Default: true
|
||||||
ssl.honor_cipher_order = true
|
ssl.honor_cipher_order = true
|
||||||
|
|
||||||
ssl.versions = ["tlsv1.3", "tlsv1.2", "tlsv1.1", "tlsv1"]
|
# ssl.versions = ["tlsv1.3", "tlsv1.2", "tlsv1.1", "tlsv1"]
|
||||||
# TLS 1.3: "TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256,TLS_CHACHA20_POLY1305_SHA256,TLS_AES_128_CCM_SHA256,TLS_AES_128_CCM_8_SHA256"
|
# TLS 1.3: "TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256,TLS_CHACHA20_POLY1305_SHA256,TLS_AES_128_CCM_SHA256,TLS_AES_128_CCM_8_SHA256"
|
||||||
# TLS 1-1.2 "ECDHE-ECDSA-AES256-GCM-SHA384,ECDHE-RSA-AES256-GCM-SHA384,ECDHE-ECDSA-AES256-SHA384,ECDHE-RSA-AES256-SHA384,ECDHE-ECDSA-DES-CBC3-SHA,ECDH-ECDSA-AES256-GCM-SHA384,ECDH-RSA-AES256-GCM-SHA384,ECDH-ECDSA-AES256-SHA384,ECDH-RSA-AES256-SHA384,DHE-DSS-AES256-GCM-SHA384,DHE-DSS-AES256-SHA256,AES256-GCM-SHA384,AES256-SHA256,ECDHE-ECDSA-AES128-GCM-SHA256,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES128-SHA256,ECDHE-RSA-AES128-SHA256,ECDH-ECDSA-AES128-GCM-SHA256,ECDH-RSA-AES128-GCM-SHA256,ECDH-ECDSA-AES128-SHA256,ECDH-RSA-AES128-SHA256,DHE-DSS-AES128-GCM-SHA256,DHE-DSS-AES128-SHA256,AES128-GCM-SHA256,AES128-SHA256,ECDHE-ECDSA-AES256-SHA,ECDHE-RSA-AES256-SHA,DHE-DSS-AES256-SHA,ECDH-ECDSA-AES256-SHA,ECDH-RSA-AES256-SHA,AES256-SHA,ECDHE-ECDSA-AES128-SHA,ECDHE-RSA-AES128-SHA,DHE-DSS-AES128-SHA,ECDH-ECDSA-AES128-SHA,ECDH-RSA-AES128-SHA,AES128-SHA"
|
# TLS 1-1.2 "ECDHE-ECDSA-AES256-GCM-SHA384,ECDHE-RSA-AES256-GCM-SHA384,ECDHE-ECDSA-AES256-SHA384,ECDHE-RSA-AES256-SHA384,ECDHE-ECDSA-DES-CBC3-SHA,ECDH-ECDSA-AES256-GCM-SHA384,ECDH-RSA-AES256-GCM-SHA384,ECDH-ECDSA-AES256-SHA384,ECDH-RSA-AES256-SHA384,DHE-DSS-AES256-GCM-SHA384,DHE-DSS-AES256-SHA256,AES256-GCM-SHA384,AES256-SHA256,ECDHE-ECDSA-AES128-GCM-SHA256,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES128-SHA256,ECDHE-RSA-AES128-SHA256,ECDH-ECDSA-AES128-GCM-SHA256,ECDH-RSA-AES128-GCM-SHA256,ECDH-ECDSA-AES128-SHA256,ECDH-RSA-AES128-SHA256,DHE-DSS-AES128-GCM-SHA256,DHE-DSS-AES128-SHA256,AES128-GCM-SHA256,AES128-SHA256,ECDHE-ECDSA-AES256-SHA,ECDHE-RSA-AES256-SHA,DHE-DSS-AES256-SHA,ECDH-ECDSA-AES256-SHA,ECDH-RSA-AES256-SHA,AES256-SHA,ECDHE-ECDSA-AES128-SHA,ECDHE-RSA-AES128-SHA,DHE-DSS-AES128-SHA,ECDH-ECDSA-AES128-SHA,ECDH-RSA-AES128-SHA,AES128-SHA"
|
||||||
# PSK: "PSK-AES128-CBC-SHA,PSK-AES256-CBC-SHA,PSK-3DES-EDE-CBC-SHA,PSK-RC4-SHA"
|
# PSK: "PSK-AES128-CBC-SHA,PSK-AES256-CBC-SHA,PSK-3DES-EDE-CBC-SHA,PSK-RC4-SHA"
|
||||||
|
|
|
@ -637,16 +637,16 @@ fields("listener_ssl_opts") ->
|
||||||
server_ssl_opts_schema(
|
server_ssl_opts_schema(
|
||||||
#{ depth => 10
|
#{ depth => 10
|
||||||
, reuse_sessions => true
|
, reuse_sessions => true
|
||||||
, versions => tcp
|
, versions => tls_all_available
|
||||||
, ciphers => tcp_all
|
, ciphers => tls_all_available
|
||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
fields("listener_wss_opts") ->
|
fields("listener_wss_opts") ->
|
||||||
server_ssl_opts_schema(
|
server_ssl_opts_schema(
|
||||||
#{ depth => 10
|
#{ depth => 10
|
||||||
, reuse_sessions => true
|
, reuse_sessions => true
|
||||||
, versions => tcp
|
, versions => tls_all_available
|
||||||
, ciphers => tcp_all
|
, ciphers => tls_all_available
|
||||||
}, true);
|
}, true);
|
||||||
fields(ssl_client_opts) ->
|
fields(ssl_client_opts) ->
|
||||||
client_ssl_opts_schema(#{});
|
client_ssl_opts_schema(#{});
|
||||||
|
@ -987,13 +987,14 @@ keyfile is password-protected."""
|
||||||
}
|
}
|
||||||
, {"versions",
|
, {"versions",
|
||||||
sc(hoconsc:array(typerefl:atom()),
|
sc(hoconsc:array(typerefl:atom()),
|
||||||
#{ default => default_tls_vsns(maps:get(versions, Defaults, tcp))
|
#{ default => default_tls_vsns(maps:get(versions, Defaults, tls_all_available))
|
||||||
, desc =>
|
, desc =>
|
||||||
"""All TLS/DTLS versions to be supported.<br>
|
"""All TLS/DTLS versions to be supported.<br>
|
||||||
NOTE: PSK ciphers are suppresed by 'tlsv1.3' version config<br>
|
NOTE: PSK ciphers are suppresed by 'tlsv1.3' version config<br>
|
||||||
In case PSK cipher suites are intended, make sure to configured
|
In case PSK cipher suites are intended, make sure to configured
|
||||||
<code>['tlsv1.2', 'tlsv1.1']</code> here.
|
<code>['tlsv1.2', 'tlsv1.1']</code> here.
|
||||||
"""
|
"""
|
||||||
|
, validator => fun validate_tls_versions/1
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
, {"ciphers", ciphers_schema(D("ciphers"))}
|
, {"ciphers", ciphers_schema(D("ciphers"))}
|
||||||
|
@ -1086,7 +1087,7 @@ client_ssl_opts_schema(Defaults) ->
|
||||||
, desc =>
|
, desc =>
|
||||||
"""Specify the host name to be used in TLS Server Name Indication extension.<br>
|
"""Specify the host name to be used in TLS Server Name Indication extension.<br>
|
||||||
For instance, when connecting to \"server.example.net\", the genuine server
|
For instance, when connecting to \"server.example.net\", the genuine server
|
||||||
which accedpts the connection and performs TSL handshake may differ from the
|
which accedpts the connection and performs TLS handshake may differ from the
|
||||||
host the TLS client initially connects to, e.g. when connecting to an IP address
|
host the TLS client initially connects to, e.g. when connecting to an IP address
|
||||||
or when the host has multiple resolvable DNS records <br>
|
or when the host has multiple resolvable DNS records <br>
|
||||||
If not specified, it will default to the host name string which is used
|
If not specified, it will default to the host name string which is used
|
||||||
|
@ -1099,12 +1100,12 @@ verification check."""
|
||||||
].
|
].
|
||||||
|
|
||||||
|
|
||||||
default_tls_vsns(dtls) ->
|
default_tls_vsns(dtls_all_available) ->
|
||||||
[<<"dtlsv1.2">>, <<"dtlsv1">>];
|
proplists:get_value(available_dtls, ssl:versions());
|
||||||
default_tls_vsns(tcp) ->
|
default_tls_vsns(tls_all_available) ->
|
||||||
[<<"tlsv1.3">>, <<"tlsv1.2">>, <<"tlsv1.1">>, <<"tlsv1">>].
|
emqx_tls_lib:default_versions().
|
||||||
|
|
||||||
-spec ciphers_schema(quic | dtls | tcp_all | undefined) -> hocon_schema:field_schema().
|
-spec ciphers_schema(quic | dtls_all_available | tls_all_available | undefined) -> hocon_schema:field_schema().
|
||||||
ciphers_schema(Default) ->
|
ciphers_schema(Default) ->
|
||||||
sc(hoconsc:array(string()),
|
sc(hoconsc:array(string()),
|
||||||
#{ default => default_ciphers(Default)
|
#{ default => default_ciphers(Default)
|
||||||
|
@ -1113,7 +1114,10 @@ ciphers_schema(Default) ->
|
||||||
(Ciphers) when is_list(Ciphers) ->
|
(Ciphers) when is_list(Ciphers) ->
|
||||||
Ciphers
|
Ciphers
|
||||||
end
|
end
|
||||||
, validator => fun validate_ciphers/1
|
, validator => case Default =:= quic of
|
||||||
|
true -> undefined; %% quic has openssl statically linked
|
||||||
|
false -> fun validate_ciphers/1
|
||||||
|
end
|
||||||
, desc =>
|
, desc =>
|
||||||
"""TLS cipher suite names separated by comma, or as an array of strings
|
"""TLS cipher suite names separated by comma, or as an array of strings
|
||||||
<code>\"TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256\"</code> or
|
<code>\"TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256\"</code> or
|
||||||
|
@ -1146,24 +1150,24 @@ RSA-PSK-DES-CBC3-SHA,RSA-PSK-RC4-SHA\"</code><br>
|
||||||
end}).
|
end}).
|
||||||
|
|
||||||
default_ciphers(undefined) ->
|
default_ciphers(undefined) ->
|
||||||
default_ciphers(tcp_all);
|
default_ciphers(tls_all_available);
|
||||||
default_ciphers(quic) -> [
|
default_ciphers(quic) -> [
|
||||||
"TLS_AES_256_GCM_SHA384",
|
"TLS_AES_256_GCM_SHA384",
|
||||||
"TLS_AES_128_GCM_SHA256",
|
"TLS_AES_128_GCM_SHA256",
|
||||||
"TLS_CHACHA20_POLY1305_SHA256"
|
"TLS_CHACHA20_POLY1305_SHA256"
|
||||||
];
|
];
|
||||||
default_ciphers(tcp_all) ->
|
default_ciphers(tls_all_available) ->
|
||||||
default_ciphers('tlsv1.3') ++
|
default_ciphers('tlsv1.3') ++
|
||||||
default_ciphers('tlsv1.2') ++
|
default_ciphers('tlsv1.2') ++
|
||||||
default_ciphers(psk);
|
default_ciphers(psk);
|
||||||
default_ciphers(dtls) ->
|
default_ciphers(dtls_all_available) ->
|
||||||
%% as of now, dtls does not support tlsv1.3 ciphers
|
%% as of now, dtls does not support tlsv1.3 ciphers
|
||||||
default_ciphers('tlsv1.2') ++ default_ciphers('psk');
|
default_ciphers('tlsv1.2') ++ default_ciphers('psk');
|
||||||
default_ciphers('tlsv1.3') ->
|
default_ciphers('tlsv1.3') ->
|
||||||
["TLS_AES_256_GCM_SHA384", "TLS_AES_128_GCM_SHA256",
|
case is_tlsv13_available() of
|
||||||
"TLS_CHACHA20_POLY1305_SHA256", "TLS_AES_128_CCM_SHA256",
|
true -> ssl:cipher_suites(exclusive, 'tlsv1.3', openssl);
|
||||||
"TLS_AES_128_CCM_8_SHA256"]
|
false -> []
|
||||||
++ default_ciphers('tlsv1.2');
|
end ++ default_ciphers('tlsv1.2');
|
||||||
default_ciphers('tlsv1.2') -> [
|
default_ciphers('tlsv1.2') -> [
|
||||||
"ECDHE-ECDSA-AES256-GCM-SHA384",
|
"ECDHE-ECDSA-AES256-GCM-SHA384",
|
||||||
"ECDHE-RSA-AES256-GCM-SHA384", "ECDHE-ECDSA-AES256-SHA384", "ECDHE-RSA-AES256-SHA384",
|
"ECDHE-RSA-AES256-GCM-SHA384", "ECDHE-ECDSA-AES256-SHA384", "ECDHE-RSA-AES256-SHA384",
|
||||||
|
@ -1314,9 +1318,22 @@ parse_user_lookup_fun(StrConf) ->
|
||||||
{fun Mod:Fun/3, <<>>}.
|
{fun Mod:Fun/3, <<>>}.
|
||||||
|
|
||||||
validate_ciphers(Ciphers) ->
|
validate_ciphers(Ciphers) ->
|
||||||
All = ssl:cipher_suites(all, 'tlsv1.3', openssl) ++
|
All = case is_tlsv13_available() of
|
||||||
ssl:cipher_suites(all, 'tlsv1.2', openssl), %% includes older version ciphers
|
true -> ssl:cipher_suites(all, 'tlsv1.3', openssl);
|
||||||
|
false -> []
|
||||||
|
end ++ ssl:cipher_suites(all, 'tlsv1.2', openssl),
|
||||||
case lists:filter(fun(Cipher) -> not lists:member(Cipher, All) end, Ciphers) of
|
case lists:filter(fun(Cipher) -> not lists:member(Cipher, All) end, Ciphers) of
|
||||||
[] -> ok;
|
[] -> ok;
|
||||||
Bad -> {error, {bad_ciphers, Bad}}
|
Bad -> {error, {bad_ciphers, Bad}}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
validate_tls_versions(Versions) ->
|
||||||
|
AvailableVersions = proplists:get_value(available, ssl:versions()) ++
|
||||||
|
proplists:get_value(available_dtls, ssl:versions()),
|
||||||
|
case lists:filter(fun(V) -> not lists:member(V, AvailableVersions) end, Versions) of
|
||||||
|
[] -> ok;
|
||||||
|
Vs -> {error, {unsupported_ssl_versions, Vs}}
|
||||||
|
end.
|
||||||
|
|
||||||
|
is_tlsv13_available() ->
|
||||||
|
lists:member('tlsv1.3', proplists:get_value(available, ssl:versions())).
|
||||||
|
|
|
@ -31,9 +31,7 @@
|
||||||
|
|
||||||
%% @doc Returns the default supported tls versions.
|
%% @doc Returns the default supported tls versions.
|
||||||
-spec default_versions() -> [atom()].
|
-spec default_versions() -> [atom()].
|
||||||
default_versions() ->
|
default_versions() -> available_versions().
|
||||||
OtpRelease = list_to_integer(erlang:system_info(otp_release)),
|
|
||||||
integral_versions(default_versions(OtpRelease)).
|
|
||||||
|
|
||||||
%% @doc Validate a given list of desired tls versions.
|
%% @doc Validate a given list of desired tls versions.
|
||||||
%% raise an error exception if non of them are available.
|
%% raise an error exception if non of them are available.
|
||||||
|
@ -51,7 +49,7 @@ integral_versions(Desired) when ?IS_STRING(Desired) ->
|
||||||
integral_versions(Desired) when is_binary(Desired) ->
|
integral_versions(Desired) when is_binary(Desired) ->
|
||||||
integral_versions(parse_versions(Desired));
|
integral_versions(parse_versions(Desired));
|
||||||
integral_versions(Desired) ->
|
integral_versions(Desired) ->
|
||||||
{_, Available} = lists:keyfind(available, 1, ssl:versions()),
|
Available = available_versions(),
|
||||||
case lists:filter(fun(V) -> lists:member(V, Available) end, Desired) of
|
case lists:filter(fun(V) -> lists:member(V, Available) end, Desired) of
|
||||||
[] -> erlang:error(#{ reason => no_available_tls_version
|
[] -> erlang:error(#{ reason => no_available_tls_version
|
||||||
, desired => Desired
|
, desired => Desired
|
||||||
|
@ -103,11 +101,17 @@ ensure_tls13_cipher(true, Ciphers) ->
|
||||||
ensure_tls13_cipher(false, Ciphers) ->
|
ensure_tls13_cipher(false, Ciphers) ->
|
||||||
Ciphers.
|
Ciphers.
|
||||||
|
|
||||||
|
%% default ssl versions based on available versions.
|
||||||
|
-spec available_versions() -> [atom()].
|
||||||
|
available_versions() ->
|
||||||
|
OtpRelease = list_to_integer(erlang:system_info(otp_release)),
|
||||||
|
default_versions(OtpRelease).
|
||||||
|
|
||||||
%% tlsv1.3 is available from OTP-22 but we do not want to use until 23.
|
%% tlsv1.3 is available from OTP-22 but we do not want to use until 23.
|
||||||
default_versions(OtpRelease) when OtpRelease >= 23 ->
|
default_versions(OtpRelease) when OtpRelease >= 23 ->
|
||||||
['tlsv1.3' | default_versions(22)];
|
proplists:get_value(available, ssl:versions());
|
||||||
default_versions(_) ->
|
default_versions(_) ->
|
||||||
['tlsv1.2', 'tlsv1.1', tlsv1].
|
lists:delete('tlsv1.3', proplists:get_value(available, ssl:versions())).
|
||||||
|
|
||||||
%% Deduplicate a list without re-ordering the elements.
|
%% Deduplicate a list without re-ordering the elements.
|
||||||
dedup([]) -> [];
|
dedup([]) -> [];
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
-include_lib("eunit/include/eunit.hrl").
|
-include_lib("eunit/include/eunit.hrl").
|
||||||
|
|
||||||
ssl_opts_dtls_test() ->
|
ssl_opts_dtls_test() ->
|
||||||
Sc = emqx_schema:server_ssl_opts_schema(#{versions => dtls,
|
Sc = emqx_schema:server_ssl_opts_schema(#{versions => dtls_all_available,
|
||||||
ciphers => dtls}, false),
|
ciphers => dtls_all_available}, false),
|
||||||
Checked = validate(Sc, #{<<"versions">> => [<<"dtlsv1.2">>, <<"dtlsv1">>]}),
|
Checked = validate(Sc, #{<<"versions">> => [<<"dtlsv1.2">>, <<"dtlsv1">>]}),
|
||||||
?assertMatch(#{versions := ['dtlsv1.2', 'dtlsv1'],
|
?assertMatch(#{versions := ['dtlsv1.2', 'dtlsv1'],
|
||||||
ciphers := ["ECDHE-ECDSA-AES256-GCM-SHA384" | _]
|
ciphers := ["ECDHE-ECDSA-AES256-GCM-SHA384" | _]
|
||||||
|
@ -73,8 +73,8 @@ bad_cipher_test() ->
|
||||||
Sc = emqx_schema:server_ssl_opts_schema(#{}, false),
|
Sc = emqx_schema:server_ssl_opts_schema(#{}, false),
|
||||||
Reason = {bad_ciphers, ["foo"]},
|
Reason = {bad_ciphers, ["foo"]},
|
||||||
?assertThrow({_Sc, [{validation_error, #{reason := Reason}}]},
|
?assertThrow({_Sc, [{validation_error, #{reason := Reason}}]},
|
||||||
[validate(Sc, #{<<"versions">> => [<<"tlsv1.2">>],
|
validate(Sc, #{<<"versions">> => [<<"tlsv1.2">>],
|
||||||
<<"ciphers">> => [<<"foo">>]})]),
|
<<"ciphers">> => [<<"foo">>]})),
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
validate(Schema, Data0) ->
|
validate(Schema, Data0) ->
|
||||||
|
@ -95,3 +95,10 @@ ciperhs_schema_test() ->
|
||||||
WSc = #{roots => [{ciphers, Sc}]},
|
WSc = #{roots => [{ciphers, Sc}]},
|
||||||
?assertThrow({_, [{validation_error, _}]},
|
?assertThrow({_, [{validation_error, _}]},
|
||||||
hocon_schema:check_plain(WSc, #{<<"ciphers">> => <<"foo,bar">>})).
|
hocon_schema:check_plain(WSc, #{<<"ciphers">> => <<"foo,bar">>})).
|
||||||
|
|
||||||
|
bad_tls_version_test() ->
|
||||||
|
Sc = emqx_schema:server_ssl_opts_schema(#{}, false),
|
||||||
|
Reason = {unsupported_ssl_versions, [foo]},
|
||||||
|
?assertThrow({_Sc, [{validation_error, #{reason := Reason}}]},
|
||||||
|
validate(Sc, #{<<"versions">> => [<<"foo">>]})),
|
||||||
|
ok.
|
||||||
|
|
|
@ -193,8 +193,8 @@ fields(dtls_opts) ->
|
||||||
emqx_schema:server_ssl_opts_schema(
|
emqx_schema:server_ssl_opts_schema(
|
||||||
#{ depth => 10
|
#{ depth => 10
|
||||||
, reuse_sessions => true
|
, reuse_sessions => true
|
||||||
, versions => dtls
|
, versions => dtls_all_available
|
||||||
, ciphers => dtls
|
, ciphers => dtls_all_available
|
||||||
}, false).
|
}, false).
|
||||||
|
|
||||||
authentication() ->
|
authentication() ->
|
||||||
|
|
Loading…
Reference in New Issue