Erlang SSL - 证书不适合sni_fun回调

时间:2018-05-15 10:42:25

标签: ssl erlang sni

我收到了这个错误:

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

{sni_fun, CallbackFun}选项中为回调函数提供der-decocded证书时。 CallbackFun返回[{cacerts, [Cert]}],其中Cert经过编码。所以事情符合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格式之间进行转换,没有错误。有没有办法在这种情况下揭示它是什么样的例外?

1 个答案:

答案 0 :(得分:0)

我解决了这个问题:sni_fun必须返回列表

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

我只回来了

[{cert, DerdecodedCert}]

(这是Erlang ssl doc的指示)

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