<div dir="ltr">I maintain a http client using httpc as part of the Hex package manager and have been trying to do proper HTTPS connections with it. In my experience there is a lot of things you have to implement yourself if you want to do it correctly and I have had many of the same questions you have. Many things are still not clear for me but hopefully I can answer some of your questions. I am going to be linking to Elixir code but I think it will be easy for an Erlang programmer to understand it.<div><br></div><div>These are the SSL options I use: <a href="https://github.com/hexpm/hex/blob/98ebb655a3e4b494795f510c07e6b16f16650e91/lib/hex/api.ex#L54-L55">https://github.com/hexpm/hex/blob/98ebb655a3e4b494795f510c07e6b16f16650e91/lib/hex/api.ex#L54-L55</a>.</div><div><br></div><div>Interesting options are `verify_fun`, Erlang doesn't seem to support hostname verification so I use an Elixir port of <a href="https://github.com/deadtrickster/ssl_verify_hostname.erl">https://github.com/deadtrickster/ssl_verify_hostname.erl</a> for that, many thanks to Ilya Khaprov for creating that library. I pass in a CA certificate store via `cacerts`, it is generated from Mozilla's store with curl's mk-ca-bundle tool <a href="http://curl.haxx.se/docs/mk-ca-bundle.html">http://curl.haxx.se/docs/mk-ca-bundle.html</a>, you can see how it is called here: <a href="https://github.com/hexpm/hex/blob/98ebb655a3e4b494795f510c07e6b16f16650e91/mix.exs#L61-L84">https://github.com/hexpm/hex/blob/98ebb655a3e4b494795f510c07e6b16f16650e91/mix.exs#L61-L84</a>.</div><div><br></div><div>Finally, unless you implement the `partial_chain` function many websites wont work because they do not send a complete certificate chain. Disclaimer: I do not know the correct (and secure) way to implement this function, I even received a security bug report recently <a href="https://github.com/hexpm/hex/issues/108">https://github.com/hexpm/hex/issues/108</a> because the old implementation was even more wrong. As you can see from the linked issue we are still not confident that this is a correct implementation. Reviews of this function from the OTP team or someone intimate with Erlang SSL would be very much appreciated.</div><div><br></div><div>There are also the new options for SNI in OTP 18 which I have not implemented yet.<br><div><br></div><div>As you can tell there is a lot of code you have to write yourself and Erlang's ssl application does not have very exhaustive documentation or any guides at all AFAICT, so it is very hard to implement this without any bugs exposing security holes and I am not very confident in my own code because of this.</div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jul 23, 2015 at 2:28 AM, Kaiduan Xie <span dir="ltr"><<a href="mailto:kaiduanx@gmail.com" target="_blank">kaiduanx@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The following articles explain thing very clearly,<br>
<br>
<a href="http://security.stackexchange.com/questions/59566/ssl-certificate-chain-verification" rel="noreferrer" target="_blank">http://security.stackexchange.com/questions/59566/ssl-certificate-chain-verification</a><br>
<br>
<a href="http://security.stackexchange.com/questions/56389/ssl-certificate-framework-101-how-does-the-browser-actually-verify-the-validity" rel="noreferrer" target="_blank">http://security.stackexchange.com/questions/56389/ssl-certificate-framework-101-how-does-the-browser-actually-verify-the-validity</a><br>
<span class="HOEnZb"><font color="#888888"><br>
/Kaiduan<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
On Wed, Jul 22, 2015 at 7:35 PM, Geoff Cant <<a href="mailto:nem@erlang.geek.nz">nem@erlang.geek.nz</a>> wrote:<br>
> Hi all, I’m wondering if anyone has written a guide (or can link to example code) showing how they use OTP’s SSL library to connect to arbitrary TLS servers on the internet with x.509 cert chain validation.<br>
><br>
> I know the default SSL library option is ‘verify_none’, and that there is a ‘cacertfile’ option, but a) it’s 2015 and you should verify cert chains, and b) are people really bundling all the standard public CA certs into a single giant cacertfile? If you are bundling say all of ubuntu’s /etc/certs, do you have any tooling for this (cat /etc/certs/*.pem >> get_me_everyone.cacerts)? Am I missing something and OTP automatically uses the contents of /etc/certs ?<br>
><br>
> Also, are people writing utility libraries/code to wrap ssl:* in order to setup the connect/listen options they use? (I know I wrote one to do certificate pinning)<br>
><br>
><br>
> I’m generally curious about your OTP ssl client use - particularly around cert chain validation.<br>
><br>
> Cheers,<br>
> -Geoff<br>
> _______________________________________________<br>
> erlang-questions mailing list<br>
> <a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
> <a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">Eric Meadows-Jönsson</div>
</div>