|
@@ -49,8 +49,8 @@ make_tls_root_fun(cacert_from_cacertfile, [TrustedOne, TrustedTwo]) ->
|
|
|
end.
|
|
end.
|
|
|
|
|
|
|
|
make_tls_verify_fun(verify_cert_extKeyUsage, KeyUsages) ->
|
|
make_tls_verify_fun(verify_cert_extKeyUsage, KeyUsages) ->
|
|
|
- AllowedKeyUsages = ext_key_opts(KeyUsages),
|
|
|
|
|
- {fun verify_fun_peer_extKeyUsage/3, AllowedKeyUsages}.
|
|
|
|
|
|
|
+ RequiredKeyUsages = ext_key_opts(KeyUsages),
|
|
|
|
|
+ {fun verify_fun_peer_extKeyUsage/3, RequiredKeyUsages}.
|
|
|
|
|
|
|
|
verify_fun_peer_extKeyUsage(_, {bad_cert, invalid_ext_key_usage}, UserState) ->
|
|
verify_fun_peer_extKeyUsage(_, {bad_cert, invalid_ext_key_usage}, UserState) ->
|
|
|
%% !! Override OTP verify peer default
|
|
%% !! Override OTP verify peer default
|
|
@@ -69,17 +69,17 @@ verify_fun_peer_extKeyUsage(
|
|
|
#'OTPCertificate'{tbsCertificate = #'OTPTBSCertificate'{extensions = ExtL}},
|
|
#'OTPCertificate'{tbsCertificate = #'OTPTBSCertificate'{extensions = ExtL}},
|
|
|
%% valid peer cert
|
|
%% valid peer cert
|
|
|
valid_peer,
|
|
valid_peer,
|
|
|
- AllowedKeyUsages
|
|
|
|
|
|
|
+ RequiredKeyUsages
|
|
|
) ->
|
|
) ->
|
|
|
%% override OTP verify_peer default
|
|
%% override OTP verify_peer default
|
|
|
%% must have id-ce-extKeyUsage
|
|
%% must have id-ce-extKeyUsage
|
|
|
case lists:keyfind(?'id-ce-extKeyUsage', 2, ExtL) of
|
|
case lists:keyfind(?'id-ce-extKeyUsage', 2, ExtL) of
|
|
|
#'Extension'{extnID = ?'id-ce-extKeyUsage', extnValue = VL} ->
|
|
#'Extension'{extnID = ?'id-ce-extKeyUsage', extnValue = VL} ->
|
|
|
- case do_verify_ext_key_usage(VL, AllowedKeyUsages) of
|
|
|
|
|
|
|
+ case do_verify_ext_key_usage(VL, RequiredKeyUsages) of
|
|
|
true ->
|
|
true ->
|
|
|
%% pass the check,
|
|
%% pass the check,
|
|
|
%% fallback to OTP verify_peer default
|
|
%% fallback to OTP verify_peer default
|
|
|
- {valid, AllowedKeyUsages};
|
|
|
|
|
|
|
+ {valid, RequiredKeyUsages};
|
|
|
false ->
|
|
false ->
|
|
|
{fail, extKeyUsage_unmatched}
|
|
{fail, extKeyUsage_unmatched}
|
|
|
end;
|
|
end;
|
|
@@ -100,9 +100,7 @@ do_verify_ext_key_usage(CertExtL, [Usage | T] = _Required) ->
|
|
|
end.
|
|
end.
|
|
|
|
|
|
|
|
%% @doc Helper tls cert extension
|
|
%% @doc Helper tls cert extension
|
|
|
--spec ext_key_opts
|
|
|
|
|
- (string()) -> [OidString :: string() | public_key:oid()];
|
|
|
|
|
- (undefined) -> undefined.
|
|
|
|
|
|
|
+-spec ext_key_opts(string()) -> [OidString :: string() | public_key:oid()].
|
|
|
ext_key_opts(Str) ->
|
|
ext_key_opts(Str) ->
|
|
|
Usages = string:tokens(Str, ","),
|
|
Usages = string:tokens(Str, ","),
|
|
|
lists:map(
|
|
lists:map(
|
|
@@ -119,7 +117,7 @@ ext_key_opts(Str) ->
|
|
|
?'id-kp-timeStamping';
|
|
?'id-kp-timeStamping';
|
|
|
("ocspSigning") ->
|
|
("ocspSigning") ->
|
|
|
?'id-kp-OCSPSigning';
|
|
?'id-kp-OCSPSigning';
|
|
|
- ([$O, $I, $D, $: | OidStr]) ->
|
|
|
|
|
|
|
+ ("OID:" ++ OidStr) ->
|
|
|
OidList = string:tokens(OidStr, "."),
|
|
OidList = string:tokens(OidStr, "."),
|
|
|
list_to_tuple(lists:map(fun list_to_integer/1, OidList))
|
|
list_to_tuple(lists:map(fun list_to_integer/1, OidList))
|
|
|
end,
|
|
end,
|