Erlang SSL - 证书不适合 sni_fun 回调
Erlang SSL - Certificate not suitable on sni_fun callback
我收到这个错误:
SSL: hello: ssl_handshake.erl:171:Fatal error: internal error - server_has_no_suitable_certificates
在 {sni_fun, CallbackFun}
选项中为回调函数提供解码后的证书。 CallbackFun
returns [{cacerts, [Cert]}]
,其中 Cert
被反编码。所以事情符合 Erlang ssl 模块的文档。
我试着查看 otp 源代码。似乎忽略了任何回调 returns,从而导致评估此函数子句:
certificate_chain(undefined, _, _) ->
{error, no_cert};
导致那个错误!但我可能是错的,因为我在浏览代码库时有点迷路了...
如果有帮助,我使用自签名 CA 来签署 CSR,这些 CSR 是在 TLS 握手期间发现 SNI 时生成的(通过 sni_fun 选项)。
请指教!非常感谢!
更新:
我尝试了 Erlang OTP 20.3 版本并得到另一个错误:
TLS server: In state hello at tls_connection.erl:739 generated SERVER ALERT: Fatal - Handshake Failure - malformed_handshake_data
查看OTP源代码,这是该块异常的结果:
try
Version = ssl_handshake:select_version(tls_record, ClientVersion, Versions),
case ssl_cipher:is_fallback(CipherSuites) of
true ->
Highest = tls_record:highest_protocol_version(Versions),
case tls_record:is_higher(Highest, Version) of
true ->
?ALERT_REC(?FATAL, ?INAPPROPRIATE_FALLBACK);
false ->
handle_client_hello(Version, Hello, SslOpts, Info, Renegotiation)
end;
false ->
handle_client_hello(Version, Hello, SslOpts, Info, Renegotiation)
end
catch
_:_ ->
?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE, malformed_handshake_data)
end.
我确定证书没问题,我可以查看它,也可以使用 openssl 在 DER/PEM 格式之间进行转换,没有任何错误。有没有办法揭示在这种情况下它是哪种异常?
我解决了问题:sni_fun必须return列表
[{cert, DerdecodedCert}, {keyfile, PathToTheCsrKeyFile}]
我只return
[{cert, DerdecodedCert}]
(Erlang ssl 文档如此指示)
希望这对遇到与我类似问题的任何人有所帮助!
我收到这个错误:
SSL: hello: ssl_handshake.erl:171:Fatal error: internal error - server_has_no_suitable_certificates
在 {sni_fun, CallbackFun}
选项中为回调函数提供解码后的证书。 CallbackFun
returns [{cacerts, [Cert]}]
,其中 Cert
被反编码。所以事情符合 Erlang ssl 模块的文档。
我试着查看 otp 源代码。似乎忽略了任何回调 returns,从而导致评估此函数子句:
certificate_chain(undefined, _, _) ->
{error, no_cert};
导致那个错误!但我可能是错的,因为我在浏览代码库时有点迷路了...
如果有帮助,我使用自签名 CA 来签署 CSR,这些 CSR 是在 TLS 握手期间发现 SNI 时生成的(通过 sni_fun 选项)。
请指教!非常感谢!
更新: 我尝试了 Erlang OTP 20.3 版本并得到另一个错误:
TLS server: In state hello at tls_connection.erl:739 generated SERVER ALERT: Fatal - Handshake Failure - malformed_handshake_data
查看OTP源代码,这是该块异常的结果:
try
Version = ssl_handshake:select_version(tls_record, ClientVersion, Versions),
case ssl_cipher:is_fallback(CipherSuites) of
true ->
Highest = tls_record:highest_protocol_version(Versions),
case tls_record:is_higher(Highest, Version) of
true ->
?ALERT_REC(?FATAL, ?INAPPROPRIATE_FALLBACK);
false ->
handle_client_hello(Version, Hello, SslOpts, Info, Renegotiation)
end;
false ->
handle_client_hello(Version, Hello, SslOpts, Info, Renegotiation)
end
catch
_:_ ->
?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE, malformed_handshake_data)
end.
我确定证书没问题,我可以查看它,也可以使用 openssl 在 DER/PEM 格式之间进行转换,没有任何错误。有没有办法揭示在这种情况下它是哪种异常?
我解决了问题:sni_fun必须return列表
[{cert, DerdecodedCert}, {keyfile, PathToTheCsrKeyFile}]
我只return
[{cert, DerdecodedCert}]
(Erlang ssl 文档如此指示)
希望这对遇到与我类似问题的任何人有所帮助!