feat(quic): support mTLS with 'verify' and 'cacertfile'

This commit is contained in:
William Yang 2023-02-03 11:36:31 +01:00
parent c7efccb996
commit 04f502fb54
2 changed files with 33 additions and 12 deletions

View File

@ -370,7 +370,8 @@ do_start_listener(quic, ListenerName, #{bind := Bind} = Opts) ->
case [A || {quicer, _, _} = A <- application:which_applications()] of case [A || {quicer, _, _} = A <- application:which_applications()] of
[_] -> [_] ->
DefAcceptors = erlang:system_info(schedulers_online) * 8, DefAcceptors = erlang:system_info(schedulers_online) * 8,
ListenOpts = [ ListenOpts =
[
{cert, maps:get(certfile, Opts)}, {cert, maps:get(certfile, Opts)},
{key, maps:get(keyfile, Opts)}, {key, maps:get(keyfile, Opts)},
{alpn, ["mqtt"]}, {alpn, ["mqtt"]},
@ -379,8 +380,12 @@ do_start_listener(quic, ListenerName, #{bind := Bind} = Opts) ->
{idle_timeout_ms, maps:get(idle_timeout, Opts, 0)}, {idle_timeout_ms, maps:get(idle_timeout, Opts, 0)},
{handshake_idle_timeout_ms, maps:get(handshake_idle_timeout, Opts, 10000)}, {handshake_idle_timeout_ms, maps:get(handshake_idle_timeout, Opts, 10000)},
{server_resumption_level, 2}, {server_resumption_level, 2},
{verify, none} {verify, maps:get(verify, Opts, verify_none)}
], ] ++
case maps:get(cacertfile, Opts, undefined) of
undefined -> [];
CaCertFile -> [{cacertfile, binary_to_list(CaCertFile)}]
end,
ConnectionOpts = #{ ConnectionOpts = #{
conn_callback => emqx_quic_connection, conn_callback => emqx_quic_connection,
peer_unidi_stream_count => 1, peer_unidi_stream_count => 1,

View File

@ -845,7 +845,15 @@ fields("mqtt_wss_listener") ->
]; ];
fields("mqtt_quic_listener") -> fields("mqtt_quic_listener") ->
[ [
%% TODO: ensure cacertfile is configurable {"cacertfile",
sc(
binary(),
#{
default => undefined,
required => false,
desc => ?DESC(common_ssl_opts_schema_cacertfile)
}
)},
{"certfile", {"certfile",
sc( sc(
string(), string(),
@ -856,6 +864,14 @@ fields("mqtt_quic_listener") ->
string(), string(),
#{desc => ?DESC(fields_mqtt_quic_listener_keyfile)} #{desc => ?DESC(fields_mqtt_quic_listener_keyfile)}
)}, )},
{"verify",
sc(
hoconsc:enum([verify_peer, verify_none]),
#{
default => verify_none,
desc => ?DESC(common_ssl_opts_schema_verify)
}
)},
{"ciphers", ciphers_schema(quic)}, {"ciphers", ciphers_schema(quic)},
{"idle_timeout", {"idle_timeout",
sc( sc(