[erlang-questions] Different SSL behaviours, how to pick ciphers?

Fred Hebert mononcqc@REDACTED
Wed Jul 13 15:41:40 CEST 2016

On 07/12, André Cruz wrote:
>As can be seen I cannot establish a connection using the container 
>version of Erlang. Looking at the traffic I can see that the 
>ClientHello message specifies SSLv3 ciphers, while the version that 
>works uses TLS1.2. How can I influence this choice of ciphers? Is it a 
>problem with the openssl lib in the container image?

You should at the very least have some basic configuration of SSL in 
Erlang -- the one that ships stock isn't particularly great.

Say for example:

  {ciphers, Ciphers},
  {honor_cipher_order, true},
  {secure_renegotiate, true},
  {client_renegotiation, false},
  {versions, ['tlsv1.2', 'tlsv1.1', 'tlsv1']}

Where `Ciphers' is a list based on either the tools at 
https://wiki.mozilla.org/Security/Server_Side_TLS or 
so you avoid ciphersuites deemed unsafe or which could give you 
compatibility issues (with say HTTP/2, which has its own blacklist of 

As a client -- and possibly as a server -- you'll also want to validate 
SSL certificates.  To do so, you can use `certifi' to provide a decent 
set of root CAs (https://github.com/certifi/erlang-certifi) and 
`ssl_verify_fun' (https://hex.pm/packages/ssl_verify_fun) to do the 
actual validation:

  {verify, verify_peer},
  {depth, 2},
  {cacerts, certifi:cacerts()},
  {server_name_indication, Hostname},
  {verify_fun, {fun ssl_verify_hostname:verify_fun/3,
                [{check_hostname, Hostname}]}

With these options, certificate validation can take place.

In case you want to do certificate pinning (validating that the request 
comes or goes to a known certificate -- more useful if you're working 
with self-signed stuff), I've so far used `Tak' 
(https://github.com/heroku/tak) to generate the SSL configuration 


More information about the erlang-questions mailing list