Erlang SSL - 证书不适合sni_fun回调



我收到此错误:

SSL: hello: ssl_handshake.erl:171:Fatal error: internal error - server_has_no_suitable_certificates

{sni_fun, CallbackFun}选项中为回调函数提供 der-decocded 证书时。CallbackFun返回[{cacerts, [Cert]}],其中Cert被der编码。所以事情符合 Erlang ssl 模块的文档。

我尝试查看 otp 源代码。似乎无论回调返回什么,都会被忽略,从而导致计算此函数子句:

certificate_chain(undefined, _, _) ->
{error, no_cert};

这会导致该错误!但我可能是错的,因为我在浏览代码库时有点迷失了方向......

如果有帮助,我使用自签名 CA 对在 TLS 握手期间发现 SNI 时生成的 CSR 进行签名(通过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必须返回

[{cert, DerdecodedCert}, {keyfile, PathToTheCsrKeyFile}]

我只回来了

[{cert, DerdecodedCert}]

(这是由 Erlang ssl 文档指示的(

希望这可以帮助任何遇到类似问题的人!

最新更新