ubill
Making SSL tests all pass for Phoenix + Let's Encrypt
Pre-info:
webserver : Cowboy only, not using nginx
My certs is from Let’s Encrypt (certbot)
Debian 8
Generated dh-param.pem file using openssl
1/
SSL Tester: https://www.htbridge.com/ssl
Right now, it can’t fulfill the “elliptic curves” criteria.
“The server supports elliptic curves that are considered weak.”
(currently I get A-, compared to capped at B- for the “do nothing” config)
Q. How do I pass in these values as in ssl — OTP 29.0.2 (ssl 11.7.2)
to my Phoenix config? (let’s say I am using dev.exs for this)
I am getting
[warn] Transport option {:eccs,
["sect571r1", "sect571k1", "secp521r1", "brainpoolP512r1", "sect409k1",
"sect409r1", "brainpoolP384r1", "secp384r1", "sect283k1", "sect283r1",
"brainpoolP256r1", "secp256k1", "secp256r1", "sect239k1", "sect233k1",
"sect233r1", "secp224k1", "secp224r1"]} unknown or invalid.
OR
[warn] Transport option {:honor_ecc_order, true} unknown or invalid.
[warn] Transport option {:eccs,
[:sect571r1, :sect571k1, :secp521r1, :brainpoolP512r1, :sect409k1, :sect409r1,
:brainpoolP384r1, :secp384r1, :sect283k1, :sect283r1, :brainpoolP256r1,
:secp256k1, :secp256r1, :sect239k1, :sect233k1, :sect233r1, :secp224k1,
:secp224r1]} unknown or invalid.
for the keys eccs and honor_ecc_order .
2/
SSL Tester: SSL Server Test (Powered by Qualys SSL Labs)
I am getting A- (improved from the basic grade of B for ‘do nothing’ config)
“The server does not support Forward Secrecy with the reference browsers. Grade reduced to A-.”
Q. Could anyone give a clue on how to resolve that?
In short:
Although I do already get A- now, but I would like to know how to pass those options that I mentioned in order to get the satisfying “full compliance as per recommended” result. (For reference, I have achieved this before in my other tech stack’s webserver.)
The main point for me is to learn how to use Phoenix’s config file to pass the options I mentioned(through cowboy?) all the way to ssl options as stated as available in ssl — OTP 29.0.2 (ssl 11.7.2)
Trending in Questions
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #elixirconf-us
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #performance
- #security










First 10 of 34 Posts!
Gazler
You should have a look at this post. Phoenix config is at the bottom Increasing security in Erlang and Elixir SSL applications – Primordial Echo
ubill
Thanks, actually, I already implemented everything from that link before testing with SSLlabs + HtBridge and asking the questions in the first post.
The issue is that the options ‘eccs’ don’t get taken into use.
Here is my config:
The HtBridge test results tell me that a group of ‘weak elliptic curves’ are in use. So my intention is to explicitly specify the elliptic curves that I want to use and not use others. The only way that looks possible is the one in the erlang ssl docs. However, the key-value as you see in my config provided above, is not recognized. So I still need some help there… hope this helps to clarify.
voltone
The warning messages are from Ranch, which is filtering out SSL options it does not recognize. Prior to version 1.3.0, Ranch only allowed whitelisted SSL options to be passed in. This was changed a few months ago to a blacklist: Blacklist listen options instead of whitelist · ninenines/ranch@b2b0996 · GitHub
Unfortunately, the latest version of Ranch on Hex appears to be 1.2.1, so you’d have to override the dependency in your
mix.exsfile and pull in 1.3.x from GitHub. I haven’t tried this myself.voltone
hey @Gazler, you’re listed as a Ranch package owner: could you push 1.3.x to Hex? If your child process isn’t flooding your mailbox, that is
(congrats!)
Gazler
Thanks! @ericmj and I have pushed ranch 1.3 to hex now.
ubill
Thank you everybody, after spending some time testing and trying to fulfill every single one of the items in the ssl tests, I have
honor_ecc_orderparam, as it might be unnecessary)client_renegotiation: false,param as without this the test score for HtBridge will be capped lowerNow I get A+ on HtBridge SSL test, and
capped to A- on SSLlabs test - because “The server does not support Forward Secrecy with the reference browsers. Grade reduced to A-.”
All in all, an immensely gratifying result from the built-in default webserver of Phoenix alone, guess that might be good enough for me and anyone else who might like to repeat this result can use the config params mentioned…
(If one wants to fulfil everything, then perhaps phoenix needs to be run behind nginx with its well-known params configured but this option didn’t appeal to me (for now.))
I am so impressed and grateful with the help given by this community… one of the best tech communities I’ve ever joined so far.
krapans
Thanks for sharing your experience, would love to read your article about this setup a-z
OvermindDL1
Yes this would be awesome to have!
voltone
Good, we’re getting closer, but we’re not there yet.
The message regarding forward secrecy from SSLLabs suggests you have cipher suites enabled that do not use a DH exchange. The
:ciphersparameter in your configuration file does list only DH-enabled suites, but unfortunately Erlang’s:sslmodule is silently ignoring the list and using its built-in defaults instead. I think you’ll find that the cipher list in the SSLLabs report does not match the list in your config file.Erlang’s
:sslmodule expects cipher suite names to be passed in as charlists (not as Elixir strings, which are Erlang binaries; not sure why it’s silently ignoring binaries, though). And moreover, the names need to use OpenSSL naming conventions. So instead of……you’d have to use…
(Note the
cmodifier at the end of the~wsigil)Shameless plug: you can use cipher_suites | Hex to select cipher suites using the OpenSSL filtering syntax often used in Apache/Nginx/… instead.
Regarding OCSP stapling: this is not currently supported by Erlang’s SSL/TLS implementation.
ubill
Hi everyone here, many thanks for your help, and for your interest!
So, now I am Proud Asian Dad, as it is possible to get A+ for BOTH ssllabs and htbridge’s ssl tests:
This:
and this:
Ok, let me see if I can provide a step by step here as an article might take too long.
1/ Basically, googling for “let’s encrypt” may eventually bring you to “certbot” which following the instructions here, you ssh into your server and follow step by step.
This obtains free SSL certs and auto-renews them using cron jobs.
A word here, the scripts by default run as root, so you may want to explore further at this stage “automated but not as root”
But if you want to just get everything running quickly to try out, you can just follow the original instructions.
2/
Next is you put the settings in your config file (e.g. dev.exs or another)
I just put the settings here that get you the A+ result above…
Also left in the commented-out options, to show that I found that they were not necessary (but others could tell more about these if they know more about them)
3/ As @voltone pointed out, if you used a wrong format for the ciphers, they will be silently ignored and the default suites used, that gets you A- or something else. If you use the one as shown here, they will be correct.
4/ So now running the tests on your server would give the same result.
‘OSCP Stapling’ item is not supported by the webserver, but that’s not quite important and there’s nothing you can do about it as well.
5/ I did not happen to try out (plug!) @voltone’s cipher_suites | Hex since I only got to know of it so late, but I expect that you will get the same good result in one step rather than doing it by hand as I did (looking up and copying the openssl aliases)
If you do try it, do let us know how it works!
Last Post!
dom
Ah yes, indeed. I just happened to hit both problems at the same time because I was trying to configure RabbitMQ for mTLS.