Merge pull request #9751 from lafirest/fix/un_cleared_ca
fix that obsoleted cert file will not be deleted after the listener is updated/deleted
This commit is contained in:
commit
a77d33b97d
|
@ -57,6 +57,10 @@
|
||||||
|
|
||||||
-export([format_bind/1]).
|
-export([format_bind/1]).
|
||||||
|
|
||||||
|
-ifdef(TEST).
|
||||||
|
-export([certs_dir/2]).
|
||||||
|
-endif.
|
||||||
|
|
||||||
-define(CONF_KEY_PATH, [listeners, '?', '?']).
|
-define(CONF_KEY_PATH, [listeners, '?', '?']).
|
||||||
-define(TYPES_STRING, ["tcp", "ssl", "ws", "wss", "quic"]).
|
-define(TYPES_STRING, ["tcp", "ssl", "ws", "wss", "quic"]).
|
||||||
|
|
||||||
|
@ -415,6 +419,7 @@ pre_config_update(_Path, _Request, RawConf) ->
|
||||||
post_config_update([listeners, Type, Name], {create, _Request}, NewConf, undefined, _AppEnvs) ->
|
post_config_update([listeners, Type, Name], {create, _Request}, NewConf, undefined, _AppEnvs) ->
|
||||||
start_listener(Type, Name, NewConf);
|
start_listener(Type, Name, NewConf);
|
||||||
post_config_update([listeners, Type, Name], {update, _Request}, NewConf, OldConf, _AppEnvs) ->
|
post_config_update([listeners, Type, Name], {update, _Request}, NewConf, OldConf, _AppEnvs) ->
|
||||||
|
try_clear_ssl_files(certs_dir(Type, Name), NewConf, OldConf),
|
||||||
case NewConf of
|
case NewConf of
|
||||||
#{enabled := true} -> restart_listener(Type, Name, {OldConf, NewConf});
|
#{enabled := true} -> restart_listener(Type, Name, {OldConf, NewConf});
|
||||||
_ -> ok
|
_ -> ok
|
||||||
|
@ -670,7 +675,7 @@ certs_dir(Type, Name) ->
|
||||||
iolist_to_binary(filename:join(["listeners", Type, Name])).
|
iolist_to_binary(filename:join(["listeners", Type, Name])).
|
||||||
|
|
||||||
convert_certs(CertsDir, Conf) ->
|
convert_certs(CertsDir, Conf) ->
|
||||||
case emqx_tls_lib:ensure_ssl_files(CertsDir, maps:get(<<"ssl_options">>, Conf, undefined)) of
|
case emqx_tls_lib:ensure_ssl_files(CertsDir, get_ssl_options(Conf)) of
|
||||||
{ok, undefined} ->
|
{ok, undefined} ->
|
||||||
Conf;
|
Conf;
|
||||||
{ok, SSL} ->
|
{ok, SSL} ->
|
||||||
|
@ -681,7 +686,7 @@ convert_certs(CertsDir, Conf) ->
|
||||||
end.
|
end.
|
||||||
|
|
||||||
clear_certs(CertsDir, Conf) ->
|
clear_certs(CertsDir, Conf) ->
|
||||||
OldSSL = maps:get(<<"ssl_options">>, Conf, undefined),
|
OldSSL = get_ssl_options(Conf),
|
||||||
emqx_tls_lib:delete_ssl_files(CertsDir, undefined, OldSSL).
|
emqx_tls_lib:delete_ssl_files(CertsDir, undefined, OldSSL).
|
||||||
|
|
||||||
filter_stacktrace({Reason, _Stacktrace}) -> Reason;
|
filter_stacktrace({Reason, _Stacktrace}) -> Reason;
|
||||||
|
@ -692,3 +697,16 @@ ensure_override_limiter_conf(Conf, #{<<"limiter">> := Limiter}) ->
|
||||||
Conf#{<<"limiter">> => Limiter};
|
Conf#{<<"limiter">> => Limiter};
|
||||||
ensure_override_limiter_conf(Conf, _) ->
|
ensure_override_limiter_conf(Conf, _) ->
|
||||||
Conf.
|
Conf.
|
||||||
|
|
||||||
|
try_clear_ssl_files(CertsDir, NewConf, OldConf) ->
|
||||||
|
NewSSL = get_ssl_options(NewConf),
|
||||||
|
OldSSL = get_ssl_options(OldConf),
|
||||||
|
emqx_tls_lib:delete_ssl_files(CertsDir, NewSSL, OldSSL).
|
||||||
|
|
||||||
|
get_ssl_options(Conf) ->
|
||||||
|
case maps:find(ssl_options, Conf) of
|
||||||
|
{ok, SSL} ->
|
||||||
|
SSL;
|
||||||
|
error ->
|
||||||
|
maps:get(<<"ssl_options">>, Conf, undefined)
|
||||||
|
end.
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIID/jCCAeagAwIBAgIJAKTICmq1Lg6dMA0GCSqGSIb3DQEBCwUAMDQxEjAQBgNV
|
||||||
|
BAoMCUVNUVggVGVzdDEeMBwGA1UEAwwVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4X
|
||||||
|
DTIxMTIzMDA4NDExMloXDTQ5MDUxNzA4NDExMlowJTESMBAGA1UECgwJRU1RWCBU
|
||||||
|
ZXN0MQ8wDQYDVQQDDAZjbGllbnQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
|
||||||
|
AoIBAQDzrujfx6XZTH0MWqLO6kNAeHndUZ+OGaURXvxKMPMF5dA40lxNG6cEzzlq
|
||||||
|
0Rm61adlv8tF4kRJrs6EnRjEVoMImrdh07vGFdOTYqP01LjiBhErAzyRtSn2X8FT
|
||||||
|
Te8ExoCRs3x61SPebGY2hOvFxuO6YDPVOSDvbbxvRgqIlM1ZXC8dOvPSSGZ+P8hV
|
||||||
|
56EPayRthfu1FVptnkW9CyZCRI0gg95Hv8RC7bGG+tuWpkN9ZrRvohhgGR1+bDUi
|
||||||
|
BNBpncEsSh+UgWaj8KRN8D16H6m/Im6ty467j0at49FvPx5nACL48/ghtYvzgKLc
|
||||||
|
uKHtokKUuuzebDK/hQxN3mUSAJStAgMBAAGjIjAgMAsGA1UdDwQEAwIFoDARBglg
|
||||||
|
hkgBhvhCAQEEBAMCB4AwDQYJKoZIhvcNAQELBQADggIBAIlVyPhOpkz3MNzQmjX7
|
||||||
|
xgJ3vGPK5uK11n/wfjRwe2qXwZbrI2sYLVtTpUgvLDuP0gB73Vwfu7xAMdue6TRm
|
||||||
|
CKr9z0lkQsVBtgoqzZCjd4PYLfHm4EhsOMi98OGKU5uOGD4g3yLwQWXHhbYtiZMO
|
||||||
|
Jsj0hebYveYJt/BYTd1syGQcIcYCyVExWvSWjidfpAqjT6EF7whdubaFtuF2kaGF
|
||||||
|
IO9yn9rWtXB5yK99uCguEmKhx3fAQxomzqweTu3WRvy9axsUH3WAUW9a4DIBSz2+
|
||||||
|
ZSJNheFn5GktgggygJUGYqpSZHooUJW0UBs/8vX6AP+8MtINmqOGZUawmNwLWLOq
|
||||||
|
wHyVt2YGD5TXjzzsWNSQ4mqXxM6AXniZVZK0yYNjA4ATikX1AtwunyWBR4IjyE/D
|
||||||
|
FxYPORdZCOtywRFE1R5KLTUq/C8BNGCkYnoO78DJBO+pT0oagkQGQb0CnmC6C1db
|
||||||
|
4lWzA9K0i4B0PyooZA+gp+5FFgaLuX1DkyeaY1J204QhHR1z/Vcyl5dpqR9hqnYP
|
||||||
|
t8raLk9ogMDKqKA9iG0wc3CBNckD4sjVWAEeovXhElG55fD21wwhF+AnDCvX8iVK
|
||||||
|
cBfKV6z6uxfKjGIxc2I643I5DiIn+V3DnPxYyY74Ln1lWFYmt5JREhAxPu42zq74
|
||||||
|
e6+eIMYFszB+5gKgt6pa6ZNI
|
||||||
|
-----END CERTIFICATE-----
|
|
@ -0,0 +1,27 @@
|
||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIIEpAIBAAKCAQEA867o38el2Ux9DFqizupDQHh53VGfjhmlEV78SjDzBeXQONJc
|
||||||
|
TRunBM85atEZutWnZb/LReJESa7OhJ0YxFaDCJq3YdO7xhXTk2Kj9NS44gYRKwM8
|
||||||
|
kbUp9l/BU03vBMaAkbN8etUj3mxmNoTrxcbjumAz1Tkg7228b0YKiJTNWVwvHTrz
|
||||||
|
0khmfj/IVeehD2skbYX7tRVabZ5FvQsmQkSNIIPeR7/EQu2xhvrblqZDfWa0b6IY
|
||||||
|
YBkdfmw1IgTQaZ3BLEoflIFmo/CkTfA9eh+pvyJurcuOu49GrePRbz8eZwAi+PP4
|
||||||
|
IbWL84Ci3Lih7aJClLrs3mwyv4UMTd5lEgCUrQIDAQABAoIBAQDwEbBgznrIwn8r
|
||||||
|
jZt5x/brbAV7Ea/kOcWSgIaCvQifFdJ2OGAwov5/UXwajNgRZe2d4z7qoUhvYuUY
|
||||||
|
ZwCAZU6ASpRBr2v9cYFYYURvrqZaHmoJew3P6q/lhl6aqFvC06DUagRHqvXEafyk
|
||||||
|
13zEAvZVpfNKrBaTawPKiDFWb2qDDc9D6hC07EuJ/DNeehiHvzHrSZSDVV5Ut7Bw
|
||||||
|
YDm33XygheUPAlHfeCnaixzcs3osiVyFEmVjxcIaM0ZS1NgcSaohSpJHMzvEaohX
|
||||||
|
e+v9vccraSVlw01AlvFwI2vHYUV8jT6HwglTPKKGOCzK/ace3wPdYSU9qLcqfuHn
|
||||||
|
EFhNc3tNAoGBAPugLMgbReJg2gpbIPUkYyoMMAAU7llFU1WvPWwXzo1a9EBjBACw
|
||||||
|
WfCZISNtANXR38zIYXzoH547uXi4YPks1Nne3sYuCDpvuX+iz7fIo4zHf1nFmxH7
|
||||||
|
eE6GtQr2ubmuuipTc28S0wBMGT1/KybH0e2NKL6GaOkNDmAI0IbEMBrvAoGBAPfr
|
||||||
|
Y1QYLhPhan6m5g/5s+bQpKtHfNH9TNkk13HuYu72zNuY3qL2GC7oSadR8vTbRXZg
|
||||||
|
KQqfaO0IGRcdkSFTq/AEhSSqr2Ld5nPadMbKvSGrSCc1s8rFH97jRVQY56yhM7ti
|
||||||
|
IW4+6cE8ylCMbdYB6wuduK/GIgNpqoF4xs1i2XojAoGACacBUMPLEH4Kny8TupOk
|
||||||
|
wi4pgTdMVVxVcAoC3yyincWJbRbfRm99Y79cCBHcYFdmsGJXawU0gUtlN/5KqgRQ
|
||||||
|
PfNQtGV7p1I12XGTakdmDrZwai8sXao52TlNpJgGU9siBRGicfZU5cQFi9he/WPY
|
||||||
|
57XshDJ/v8DidkigRysrdT0CgYEA5iuO22tblC+KvK1dGOXeZWO+DhrfwuGlcFBp
|
||||||
|
CaimB2/w/8vsn2VVTG9yujo2E6hj1CQw1mDrfG0xRim4LTXOgpbfugwRqvuTUmo2
|
||||||
|
Ur21XEX2RhjwpEfhcACWxB4fMUG0krrniMA2K6axupi1/KNpQi6bYe3UdFCs8Wld
|
||||||
|
QSAOAvsCgYBk/X5PmD44DvndE5FShM2w70YOoMr3Cgl5sdwAFUFE9yDuC14UhVxk
|
||||||
|
oxnYxwtVI9uVVirET+LczP9JEvcvxnN/Xg3tH/qm0WlIxmTxyYrFFIK9j0rqeu9z
|
||||||
|
blPu56OzNI2VMrR1GbOBLxQINLTIpaacjNJAlr8XOlegdUJsW/Jwqw==
|
||||||
|
-----END RSA PRIVATE KEY-----
|
|
@ -0,0 +1,27 @@
|
||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIIEpAIBAAKCAQEAzLiGiSwpxkENtjrzS7pNLblTnWe4HUUFwYyUX0H+3TnvA86X
|
||||||
|
EX85yZvFjkzB6lLjUkMY+C6UTVXt+mxeSJbUtSKZhX+2yoF/KYh7SaVjug5FqEqO
|
||||||
|
LvMpDZQEhUWF2W9DG6eUgOfDoX2milSDIe10yG2WBkryipHAfE7l1t+i6Rh3on+v
|
||||||
|
561LmrbqyBWR/cLp23RN3sHbkf2pb5/ugtU9twdgJr6Lve73rvSeulewL5BzszKD
|
||||||
|
BrYqr+PBT5+3ItCc55bTsO7M7CzOIL99BlqdvFH7xT0U1+2BFwLe4/8kwphSqyJE
|
||||||
|
C5oOiQBFnFVNXmFQSV+k7rPr80i1IO++HeJ6KQIDAQABAoIBAGWgvPjfuaU3qizq
|
||||||
|
uti/FY07USz0zkuJdkANH6LiSjlchzDmn8wJ0pApCjuIE0PV/g9aS8z4opp5q/gD
|
||||||
|
UBLM/a8mC/xf2EhTXOMrY7i9p/I3H5FZ4ZehEqIw9sWKK9YzC6dw26HabB2BGOnW
|
||||||
|
5nozPSQ6cp2RGzJ7BIkxSZwPzPnVTgy3OAuPOiJytvK+hGLhsNaT+Y9bNDvplVT2
|
||||||
|
ZwYTV8GlHZC+4b2wNROILm0O86v96O+Qd8nn3fXjGHbMsAnONBq10bZS16L4fvkH
|
||||||
|
5G+W/1PeSXmtZFppdRRDxIW+DWcXK0D48WRliuxcV4eOOxI+a9N2ZJZZiNLQZGwg
|
||||||
|
w3A8+mECgYEA8HuJFrlRvdoBe2U/EwUtG74dcyy30L4yEBnN5QscXmEEikhaQCfX
|
||||||
|
Wm6EieMcIB/5I5TQmSw0cmBMeZjSXYoFdoI16/X6yMMuATdxpvhOZGdUGXxhAH+x
|
||||||
|
xoTUavWZnEqW3fkUU71kT5E2f2i+0zoatFESXHeslJyz85aAYpP92H0CgYEA2e5A
|
||||||
|
Yozt5eaA1Gyhd8SeptkEU4xPirNUnVQHStpMWUb1kzTNXrPmNWccQ7JpfpG6DcYl
|
||||||
|
zUF6p6mlzY+zkMiyPQjwEJlhiHM2NlL1QS7td0R8ewgsFoyn8WsBI4RejWrEG9td
|
||||||
|
EDniuIw+pBFkcWthnTLHwECHdzgquToyTMjrBB0CgYEA28tdGbrZXhcyAZEhHAZA
|
||||||
|
Gzog+pKlkpEzeonLKIuGKzCrEKRecIK5jrqyQsCjhS0T7ZRnL4g6i0s+umiV5M5w
|
||||||
|
fcc292pEA1h45L3DD6OlKplSQVTv55/OYS4oY3YEJtf5mfm8vWi9lQeY8sxOlQpn
|
||||||
|
O+VZTdBHmTC8PGeTAgZXHZUCgYA6Tyv88lYowB7SN2qQgBQu8jvdGtqhcs/99GCr
|
||||||
|
H3N0I69LPsKAR0QeH8OJPXBKhDUywESXAaEOwS5yrLNP1tMRz5Vj65YUCzeDG3kx
|
||||||
|
gpvY4IMp7ArX0bSRvJ6mYSFnVxy3k174G3TVCfksrtagHioVBGQ7xUg5ltafjrms
|
||||||
|
n8l55QKBgQDVzU8tQvBVqY8/1lnw11Vj4fkE/drZHJ5UkdC1eenOfSWhlSLfUJ8j
|
||||||
|
ds7vEWpRPPoVuPZYeR1y78cyxKe1GBx6Wa2lF5c7xjmiu0xbRnrxYeLolce9/ntp
|
||||||
|
asClqpnHT8/VJYTD7Kqj0fouTTZf0zkig/y+2XERppd8k+pSKjUCPQ==
|
||||||
|
-----END RSA PRIVATE KEY-----
|
|
@ -151,6 +151,60 @@ t_api_listeners_list_not_ready(_Config) ->
|
||||||
emqx_common_test_helpers:stop_slave(Node2)
|
emqx_common_test_helpers:stop_slave(Node2)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
t_clear_certs(_) ->
|
||||||
|
ListenerId = <<"ssl:default">>,
|
||||||
|
NewListenerId = <<"ssl:clear">>,
|
||||||
|
|
||||||
|
OriginPath = emqx_mgmt_api_test_util:api_path(["listeners", ListenerId]),
|
||||||
|
NewPath = emqx_mgmt_api_test_util:api_path(["listeners", NewListenerId]),
|
||||||
|
ConfTempT = request(get, OriginPath, [], []),
|
||||||
|
ConfTemp = ConfTempT#{
|
||||||
|
<<"id">> => NewListenerId,
|
||||||
|
<<"bind">> => <<"0.0.0.0:2883">>
|
||||||
|
},
|
||||||
|
|
||||||
|
%% create, make sure the cert files are created
|
||||||
|
NewConf = emqx_map_lib:deep_put(
|
||||||
|
[<<"ssl_options">>, <<"certfile">>], ConfTemp, cert_file("certfile")
|
||||||
|
),
|
||||||
|
NewConf2 = emqx_map_lib:deep_put(
|
||||||
|
[<<"ssl_options">>, <<"keyfile">>], NewConf, cert_file("keyfile")
|
||||||
|
),
|
||||||
|
|
||||||
|
_ = request(post, NewPath, [], NewConf2),
|
||||||
|
ListResult1 = list_pem_dir("ssl", "clear"),
|
||||||
|
?assertMatch({ok, [_, _]}, ListResult1),
|
||||||
|
|
||||||
|
%% update
|
||||||
|
UpdateConf = emqx_map_lib:deep_put(
|
||||||
|
[<<"ssl_options">>, <<"keyfile">>], NewConf2, cert_file("keyfile2")
|
||||||
|
),
|
||||||
|
_ = request(put, NewPath, [], UpdateConf),
|
||||||
|
ListResult2 = list_pem_dir("ssl", "clear"),
|
||||||
|
|
||||||
|
%% make sure the old cret file is deleted
|
||||||
|
?assertMatch({ok, [_, _]}, ListResult2),
|
||||||
|
|
||||||
|
{ok, ResultList1} = ListResult1,
|
||||||
|
{ok, ResultList2} = ListResult2,
|
||||||
|
|
||||||
|
FindKeyFile = fun(List) ->
|
||||||
|
case lists:search(fun(E) -> lists:prefix("key", E) end, List) of
|
||||||
|
{value, Value} ->
|
||||||
|
Value;
|
||||||
|
_ ->
|
||||||
|
?assert(false, "Can't find keyfile")
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
%% check the keyfile has changed
|
||||||
|
?assertNotEqual(FindKeyFile(ResultList1), FindKeyFile(ResultList2)),
|
||||||
|
|
||||||
|
%% remove, check all cert files are deleted
|
||||||
|
_ = delete(NewPath),
|
||||||
|
?assertMatch({error, not_dir}, list_pem_dir("ssl", "clear")),
|
||||||
|
ok.
|
||||||
|
|
||||||
get_tcp_listeners(Node) ->
|
get_tcp_listeners(Node) ->
|
||||||
Query = #{query_string => #{<<"type">> => tcp}},
|
Query = #{query_string => #{<<"type">> => tcp}},
|
||||||
{200, L} = rpc:call(Node, emqx_mgmt_api_listeners, list_listeners, [get, Query]),
|
{200, L} = rpc:call(Node, emqx_mgmt_api_listeners, list_listeners, [get, Query]),
|
||||||
|
@ -314,3 +368,21 @@ listener_stats(Listener, ExpectedStats) ->
|
||||||
|
|
||||||
is_running(Id) ->
|
is_running(Id) ->
|
||||||
emqx_listeners:is_running(binary_to_atom(Id)).
|
emqx_listeners:is_running(binary_to_atom(Id)).
|
||||||
|
|
||||||
|
list_pem_dir(Type, Name) ->
|
||||||
|
ListenerDir = emqx_listeners:certs_dir(Type, Name),
|
||||||
|
Dir = filename:join([emqx:mutable_certs_dir(), ListenerDir]),
|
||||||
|
case filelib:is_dir(Dir) of
|
||||||
|
true ->
|
||||||
|
file:list_dir(Dir);
|
||||||
|
_ ->
|
||||||
|
{error, not_dir}
|
||||||
|
end.
|
||||||
|
|
||||||
|
data_file(Name) ->
|
||||||
|
Dir = code:lib_dir(emqx, test),
|
||||||
|
{ok, Bin} = file:read_file(filename:join([Dir, "data", Name])),
|
||||||
|
Bin.
|
||||||
|
|
||||||
|
cert_file(Name) ->
|
||||||
|
data_file(filename:join(["certs", Name])).
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fix that obsoleted cert file will not be deleted after the listener is updated/deleted
|
|
@ -0,0 +1 @@
|
||||||
|
修复在更新或者删除监听器后,过时的证书文件没有被删除的问题。
|
Loading…
Reference in New Issue