|
|
@@ -90,14 +90,14 @@ ssl_files_failure_test_() ->
|
|
|
{"undefined_is_undefined", fun() ->
|
|
|
?assertEqual(
|
|
|
{ok, undefined},
|
|
|
- emqx_tls_lib:ensure_ssl_files("dir", undefined)
|
|
|
+ emqx_tls_lib:ensure_ssl_files_in_mutable_certs_dir("dir", undefined)
|
|
|
)
|
|
|
end},
|
|
|
{"no_op_if_disabled", fun() ->
|
|
|
Disabled = #{<<"enable">> => false, foo => bar},
|
|
|
?assertEqual(
|
|
|
{ok, Disabled},
|
|
|
- emqx_tls_lib:ensure_ssl_files("dir", Disabled)
|
|
|
+ emqx_tls_lib:ensure_ssl_files_in_mutable_certs_dir("dir", Disabled)
|
|
|
)
|
|
|
end},
|
|
|
{"enoent_key_file", fun() ->
|
|
|
@@ -106,7 +106,7 @@ ssl_files_failure_test_() ->
|
|
|
),
|
|
|
?assertMatch(
|
|
|
{error, #{file_read := enoent, pem_check := invalid_pem}},
|
|
|
- emqx_tls_lib:ensure_ssl_files("/tmp", #{
|
|
|
+ emqx_tls_lib:ensure_ssl_files_in_mutable_certs_dir("/tmp", #{
|
|
|
<<"keyfile">> => NonExistingFile,
|
|
|
<<"certfile">> => test_key(),
|
|
|
<<"cacertfile">> => test_key()
|
|
|
@@ -116,7 +116,7 @@ ssl_files_failure_test_() ->
|
|
|
{"empty_cacertfile", fun() ->
|
|
|
?assertMatch(
|
|
|
{ok, _},
|
|
|
- emqx_tls_lib:ensure_ssl_files("/tmp", #{
|
|
|
+ emqx_tls_lib:ensure_ssl_files_in_mutable_certs_dir("/tmp", #{
|
|
|
<<"keyfile">> => test_key(),
|
|
|
<<"certfile">> => test_key(),
|
|
|
<<"cacertfile">> => <<"">>
|
|
|
@@ -130,7 +130,7 @@ ssl_files_failure_test_() ->
|
|
|
reason := pem_file_path_or_string_is_required,
|
|
|
which_options := [[<<"keyfile">>]]
|
|
|
}},
|
|
|
- emqx_tls_lib:ensure_ssl_files("/tmp", #{
|
|
|
+ emqx_tls_lib:ensure_ssl_files_in_mutable_certs_dir("/tmp", #{
|
|
|
<<"keyfile">> => <<>>,
|
|
|
<<"certfile">> => test_key(),
|
|
|
<<"cacertfile">> => test_key()
|
|
|
@@ -141,7 +141,7 @@ ssl_files_failure_test_() ->
|
|
|
{error, #{
|
|
|
reason := invalid_file_path_or_pem_string, which_options := [[<<"keyfile">>]]
|
|
|
}},
|
|
|
- emqx_tls_lib:ensure_ssl_files("/tmp", #{
|
|
|
+ emqx_tls_lib:ensure_ssl_files_in_mutable_certs_dir("/tmp", #{
|
|
|
<<"keyfile">> => <<255, 255>>,
|
|
|
<<"certfile">> => test_key(),
|
|
|
<<"cacertfile">> => test_key()
|
|
|
@@ -152,7 +152,7 @@ ssl_files_failure_test_() ->
|
|
|
reason := invalid_file_path_or_pem_string,
|
|
|
which_options := [[<<"ocsp">>, <<"issuer_pem">>]]
|
|
|
}},
|
|
|
- emqx_tls_lib:ensure_ssl_files("/tmp", #{
|
|
|
+ emqx_tls_lib:ensure_ssl_files_in_mutable_certs_dir("/tmp", #{
|
|
|
<<"keyfile">> => test_key(),
|
|
|
<<"certfile">> => test_key(),
|
|
|
<<"cacertfile">> => test_key(),
|
|
|
@@ -162,7 +162,7 @@ ssl_files_failure_test_() ->
|
|
|
%% not printable
|
|
|
?assertMatch(
|
|
|
{error, #{reason := invalid_file_path_or_pem_string}},
|
|
|
- emqx_tls_lib:ensure_ssl_files("/tmp", #{
|
|
|
+ emqx_tls_lib:ensure_ssl_files_in_mutable_certs_dir("/tmp", #{
|
|
|
<<"keyfile">> => <<33, 22>>,
|
|
|
<<"certfile">> => test_key(),
|
|
|
<<"cacertfile">> => test_key()
|
|
|
@@ -173,7 +173,7 @@ ssl_files_failure_test_() ->
|
|
|
ok = file:write_file(TmpFile, <<"not a valid pem">>),
|
|
|
?assertMatch(
|
|
|
{error, #{file_read := not_pem}},
|
|
|
- emqx_tls_lib:ensure_ssl_files(
|
|
|
+ emqx_tls_lib:ensure_ssl_files_in_mutable_certs_dir(
|
|
|
"/tmp",
|
|
|
#{
|
|
|
<<"cacertfile">> => bin(TmpFile),
|
|
|
@@ -205,8 +205,8 @@ ssl_file_replace_test() ->
|
|
|
<<"ocsp">> => #{<<"issuer_pem">> => Key2}
|
|
|
},
|
|
|
Dir = filename:join(["/tmp", "ssl-test-dir2"]),
|
|
|
- {ok, SSL2} = emqx_tls_lib:ensure_ssl_files(Dir, SSL0),
|
|
|
- {ok, SSL3} = emqx_tls_lib:ensure_ssl_files(Dir, SSL1),
|
|
|
+ {ok, SSL2} = emqx_tls_lib:ensure_ssl_files_in_mutable_certs_dir(Dir, SSL0),
|
|
|
+ {ok, SSL3} = emqx_tls_lib:ensure_ssl_files_in_mutable_certs_dir(Dir, SSL1),
|
|
|
File1 = maps:get(<<"keyfile">>, SSL2),
|
|
|
File2 = maps:get(<<"keyfile">>, SSL3),
|
|
|
IssuerPem1 = emqx_utils_maps:deep_get([<<"ocsp">>, <<"issuer_pem">>], SSL2),
|
|
|
@@ -224,17 +224,39 @@ ssl_file_deterministic_names_test() ->
|
|
|
},
|
|
|
Dir0 = filename:join(["/tmp", ?FUNCTION_NAME, "ssl0"]),
|
|
|
Dir1 = filename:join(["/tmp", ?FUNCTION_NAME, "ssl1"]),
|
|
|
- {ok, SSLFiles0} = emqx_tls_lib:ensure_ssl_files(Dir0, SSL0),
|
|
|
+ {ok, SSLFiles0} = emqx_tls_lib:ensure_ssl_files_in_mutable_certs_dir(Dir0, SSL0),
|
|
|
?assertEqual(
|
|
|
{ok, SSLFiles0},
|
|
|
- emqx_tls_lib:ensure_ssl_files(Dir0, SSL0)
|
|
|
+ emqx_tls_lib:ensure_ssl_files_in_mutable_certs_dir(Dir0, SSL0)
|
|
|
),
|
|
|
?assertNotEqual(
|
|
|
{ok, SSLFiles0},
|
|
|
- emqx_tls_lib:ensure_ssl_files(Dir1, SSL0)
|
|
|
+ emqx_tls_lib:ensure_ssl_files_in_mutable_certs_dir(Dir1, SSL0)
|
|
|
),
|
|
|
_ = file:del_dir_r(filename:join(["/tmp", ?FUNCTION_NAME])).
|
|
|
|
|
|
+ssl_file_name_hash_test() ->
|
|
|
+ ?assertMatch(
|
|
|
+ {ok, #{
|
|
|
+ <<"cacertfile">> := <<"data/certs/authz/http/cacert-C62234D748AB82B0">>,
|
|
|
+ <<"certfile">> := <<"data/certs/authz/http/cert-0D6E53DBDEF594A4">>,
|
|
|
+ <<"enable">> := true,
|
|
|
+ <<"keyfile">> := <<"data/certs/authz/http/key-D5BB7F027841FA62">>,
|
|
|
+ <<"verify">> := <<"verify_peer">>
|
|
|
+ }},
|
|
|
+ emqx_tls_lib:ensure_ssl_files_in_mutable_certs_dir(
|
|
|
+ <<"authz/http">>,
|
|
|
+ #{
|
|
|
+ <<"cacertfile">> => test_name_hash_cacert(),
|
|
|
+ <<"certfile">> => test_name_hash_cert(),
|
|
|
+ <<"keyfile">> => test_name_hash_key(),
|
|
|
+ <<"enable">> => true,
|
|
|
+ <<"verify">> => <<"verify_peer">>
|
|
|
+ }
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ ok.
|
|
|
+
|
|
|
to_client_opts_test() ->
|
|
|
VersionsAll = [tlsv1, 'tlsv1.1', 'tlsv1.2', 'tlsv1.3'],
|
|
|
Versions13Only = ['tlsv1.3'],
|
|
|
@@ -329,3 +351,81 @@ test_key2() ->
|
|
|
"AbToUD4JmV9m/XwcSVH06ZaWqNuC5w==\n"
|
|
|
"-----END EC PRIVATE KEY-----\n"
|
|
|
>>.
|
|
|
+
|
|
|
+test_name_hash_cacert() ->
|
|
|
+ <<
|
|
|
+ "-----BEGIN CERTIFICATE-----\n"
|
|
|
+ "MIIDUTCCAjmgAwIBAgIJAPPYCjTmxdt/MA0GCSqGSIb3DQEBCwUAMD8xCzAJBgNV\n"
|
|
|
+ "BAYTAkNOMREwDwYDVQQIDAhoYW5nemhvdTEMMAoGA1UECgwDRU1RMQ8wDQYDVQQD\n"
|
|
|
+ "DAZSb290Q0EwHhcNMjAwNTA4MDgwNjUyWhcNMzAwNTA2MDgwNjUyWjA/MQswCQYD\n"
|
|
|
+ "VQQGEwJDTjERMA8GA1UECAwIaGFuZ3pob3UxDDAKBgNVBAoMA0VNUTEPMA0GA1UE\n"
|
|
|
+ "AwwGUm9vdENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzcgVLex1\n"
|
|
|
+ "EZ9ON64EX8v+wcSjzOZpiEOsAOuSXOEN3wb8FKUxCdsGrsJYB7a5VM/Jot25Mod2\n"
|
|
|
+ "juS3OBMg6r85k2TWjdxUoUs+HiUB/pP/ARaaW6VntpAEokpij/przWMPgJnBF3Ur\n"
|
|
|
+ "MjtbLayH9hGmpQrI5c2vmHQ2reRZnSFbY+2b8SXZ+3lZZgz9+BaQYWdQWfaUWEHZ\n"
|
|
|
+ "uDaNiViVO0OT8DRjCuiDp3yYDj3iLWbTA/gDL6Tf5XuHuEwcOQUrd+h0hyIphO8D\n"
|
|
|
+ "tsrsHZ14j4AWYLk1CPA6pq1HIUvEl2rANx2lVUNv+nt64K/Mr3RnVQd9s8bK+TXQ\n"
|
|
|
+ "KGHd2Lv/PALYuwIDAQABo1AwTjAdBgNVHQ4EFgQUGBmW+iDzxctWAWxmhgdlE8Pj\n"
|
|
|
+ "EbQwHwYDVR0jBBgwFoAUGBmW+iDzxctWAWxmhgdlE8PjEbQwDAYDVR0TBAUwAwEB\n"
|
|
|
+ "/zANBgkqhkiG9w0BAQsFAAOCAQEAGbhRUjpIred4cFAFJ7bbYD9hKu/yzWPWkMRa\n"
|
|
|
+ "ErlCKHmuYsYk+5d16JQhJaFy6MGXfLgo3KV2itl0d+OWNH0U9ULXcglTxy6+njo5\n"
|
|
|
+ "CFqdUBPwN1jxhzo9yteDMKF4+AHIxbvCAJa17qcwUKR5MKNvv09C6pvQDJLzid7y\n"
|
|
|
+ "E2dkgSuggik3oa0427KvctFf8uhOV94RvEDyqvT5+pgNYZ2Yfga9pD/jjpoHEUlo\n"
|
|
|
+ "88IGU8/wJCx3Ds2yc8+oBg/ynxG8f/HmCC1ET6EHHoe2jlo8FpU/SgGtghS1YL30\n"
|
|
|
+ "IWxNsPrUP+XsZpBJy/mvOhE5QXo6Y35zDqqj8tI7AGmAWu22jg==\n"
|
|
|
+ "-----END CERTIFICATE-----\n"
|
|
|
+ >>.
|
|
|
+
|
|
|
+test_name_hash_cert() ->
|
|
|
+ <<
|
|
|
+ "-----BEGIN CERTIFICATE-----\n"
|
|
|
+ "MIIDEzCCAfugAwIBAgIBAjANBgkqhkiG9w0BAQsFADA/MQswCQYDVQQGEwJDTjER\n"
|
|
|
+ "MA8GA1UECAwIaGFuZ3pob3UxDDAKBgNVBAoMA0VNUTEPMA0GA1UEAwwGUm9vdENB\n"
|
|
|
+ "MB4XDTIwMDUwODA4MDcwNVoXDTMwMDUwNjA4MDcwNVowPzELMAkGA1UEBhMCQ04x\n"
|
|
|
+ "ETAPBgNVBAgMCGhhbmd6aG91MQwwCgYDVQQKDANFTVExDzANBgNVBAMMBlNlcnZl\n"
|
|
|
+ "cjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALNeWT3pE+QFfiRJzKmn\n"
|
|
|
+ "AMUrWo3K2j/Tm3+Xnl6WLz67/0rcYrJbbKvS3uyRP/stXyXEKw9CepyQ1ViBVFkW\n"
|
|
|
+ "Aoy8qQEOWFDsZc/5UzhXUnb6LXr3qTkFEjNmhj+7uzv/lbBxlUG1NlYzSeOB6/RT\n"
|
|
|
+ "8zH/lhOeKhLnWYPXdXKsa1FL6ij4X8DeDO1kY7fvAGmBn/THh1uTpDizM4YmeI+7\n"
|
|
|
+ "4dmayA5xXvARte5h4Vu5SIze7iC057N+vymToMk2Jgk+ZZFpyXrnq+yo6RaD3ANc\n"
|
|
|
+ "lrc4FbeUQZ5a5s5Sxgs9a0Y3WMG+7c5VnVXcbjBRz/aq2NtOnQQjikKKQA8GF080\n"
|
|
|
+ "BQkCAwEAAaMaMBgwCQYDVR0TBAIwADALBgNVHQ8EBAMCBeAwDQYJKoZIhvcNAQEL\n"
|
|
|
+ "BQADggEBAJefnMZpaRDHQSNUIEL3iwGXE9c6PmIsQVE2ustr+CakBp3TZ4l0enLt\n"
|
|
|
+ "iGMfEVFju69cO4oyokWv+hl5eCMkHBf14Kv51vj448jowYnF1zmzn7SEzm5Uzlsa\n"
|
|
|
+ "sqjtAprnLyof69WtLU1j5rYWBuFX86yOTwRAFNjm9fvhAcrEONBsQtqipBWkMROp\n"
|
|
|
+ "iUYMkRqbKcQMdwxov+lHBYKq9zbWRoqLROAn54SRqgQk6c15JdEfgOOjShbsOkIH\n"
|
|
|
+ "UhqcwRkQic7n1zwHVGVDgNIZVgmJ2IdIWBlPEC7oLrRrBD/X1iEEXtKab6p5o22n\n"
|
|
|
+ "KB5mN+iQaE+Oe2cpGKZJiJRdM+IqDDQ=\n"
|
|
|
+ "-----END CERTIFICATE-----\n"
|
|
|
+ >>.
|
|
|
+
|
|
|
+test_name_hash_key() ->
|
|
|
+ <<
|
|
|
+ "-----BEGIN RSA PRIVATE KEY-----\n"
|
|
|
+ "MIIEowIBAAKCAQEAs15ZPekT5AV+JEnMqacAxStajcraP9Obf5eeXpYvPrv/Stxi\n"
|
|
|
+ "sltsq9Le7JE/+y1fJcQrD0J6nJDVWIFUWRYCjLypAQ5YUOxlz/lTOFdSdvotevep\n"
|
|
|
+ "OQUSM2aGP7u7O/+VsHGVQbU2VjNJ44Hr9FPzMf+WE54qEudZg9d1cqxrUUvqKPhf\n"
|
|
|
+ "wN4M7WRjt+8AaYGf9MeHW5OkOLMzhiZ4j7vh2ZrIDnFe8BG17mHhW7lIjN7uILTn\n"
|
|
|
+ "s36/KZOgyTYmCT5lkWnJeuer7KjpFoPcA1yWtzgVt5RBnlrmzlLGCz1rRjdYwb7t\n"
|
|
|
+ "zlWdVdxuMFHP9qrY206dBCOKQopADwYXTzQFCQIDAQABAoIBAQCuvCbr7Pd3lvI/\n"
|
|
|
+ "n7VFQG+7pHRe1VKwAxDkx2t8cYos7y/QWcm8Ptwqtw58HzPZGWYrgGMCRpzzkRSF\n"
|
|
|
+ "V9g3wP1S5Scu5C6dBu5YIGc157tqNGXB+SpdZddJQ4Nc6yGHXYERllT04ffBGc3N\n"
|
|
|
+ "WG/oYS/1cSteiSIrsDy/91FvGRCi7FPxH3wIgHssY/tw69s1Cfvaq5lr2NTFzxIG\n"
|
|
|
+ "xCvpJKEdSfVfS9I7LYiymVjst3IOR/w76/ZFY9cRa8ZtmQSWWsm0TUpRC1jdcbkm\n"
|
|
|
+ "ZoJptYWlP+gSwx/fpMYftrkJFGOJhHJHQhwxT5X/ajAISeqjjwkWSEJLwnHQd11C\n"
|
|
|
+ "Zy2+29lBAoGBANlEAIK4VxCqyPXNKfoOOi5dS64NfvyH4A1v2+KaHWc7lqaqPN49\n"
|
|
|
+ "ezfN2n3X+KWx4cviDD914Yc2JQ1vVJjSaHci7yivocDo2OfZDmjBqzaMp/y+rX1R\n"
|
|
|
+ "/f3MmiTqMa468rjaxI9RRZu7vDgpTR+za1+OBCgMzjvAng8dJuN/5gjlAoGBANNY\n"
|
|
|
+ "uYPKtearBmkqdrSV7eTUe49Nhr0XotLaVBH37TCW0Xv9wjO2xmbm5Ga/DCtPIsBb\n"
|
|
|
+ "yPeYwX9FjoasuadUD7hRvbFu6dBa0HGLmkXRJZTcD7MEX2Lhu4BuC72yDLLFd0r+\n"
|
|
|
+ "Ep9WP7F5iJyagYqIZtz+4uf7gBvUDdmvXz3sGr1VAoGAdXTD6eeKeiI6PlhKBztF\n"
|
|
|
+ "zOb3EQOO0SsLv3fnodu7ZaHbUgLaoTMPuB17r2jgrYM7FKQCBxTNdfGZmmfDjlLB\n"
|
|
|
+ "0xZ5wL8ibU30ZXL8zTlWPElST9sto4B+FYVVF/vcG9sWeUUb2ncPcJ/Po3UAktDG\n"
|
|
|
+ "jYQTTyuNGtSJHpad/YOZctkCgYBtWRaC7bq3of0rJGFOhdQT9SwItN/lrfj8hyHA\n"
|
|
|
+ "OjpqTV4NfPmhsAtu6j96OZaeQc+FHvgXwt06cE6Rt4RG4uNPRluTFgO7XYFDfitP\n"
|
|
|
+ "vCppnoIw6S5BBvHwPP+uIhUX2bsi/dm8vu8tb+gSvo4PkwtFhEr6I9HglBKmcmog\n"
|
|
|
+ "q6waEQKBgHyecFBeM6Ls11Cd64vborwJPAuxIW7HBAFj/BS99oeG4TjBx4Sz2dFd\n"
|
|
|
+ "rzUibJt4ndnHIvCN8JQkjNG14i9hJln+H3mRss8fbZ9vQdqG+2vOWADYSzzsNI55\n"
|
|
|
+ "RFY7JjluKcVkp/zCDeUxTU3O6sS+v6/3VE11Cob6OYQx3lN5wrZ3\n"
|
|
|
+ "-----END RSA PRIVATE KEY-----\n"
|
|
|
+ >>.
|