<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Please make sure to also pass {verify, verify_peer}, since any ssl_options you pass will overwrite the hackney defaults, and therefore pick up the ssl default of verify_none.<div><br></div><div><div>Eshell V10.2.5  (abort with ^G)</div><div>1> hackney:request(get, <<"<a href="https://self-signed.badssl.com/">https://self-signed.badssl.com/</a>">>, [], <<>>, [{ssl_options, [{cacertfile, certifi:cacertfile()}]}]).</div><div>{ok,200,[...],#Ref<...>} // Not good!</div><div>2> hackney:request(get, <<"<a href="https://self-signed.badssl.com/">https://self-signed.badssl.com/</a>">>, [], <<>>, [{ssl_options, [{cacertfile, certifi:cacertfile()}, {verify, verify_peer}]}]).<br></div><div>{error,{tls_alert,"bad certificate"}}<br></div><div><br></div><div>Bram</div><div><br></div><div><br></div></div></div></div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, 11 Jun 2019 at 09:06, Jamie McClymont <<a href="mailto:jamie%2Berlang-questions@kwiius.com">jamie+erlang-questions@kwiius.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Ahh that did it, thanks!<br>
<br>
I'm using hackney, which in turn uses certifi:cacerts() (binary blobs of cert data).<br>
<br>
Using hackney's ssl options to instead pass certifi:cacertfile() as an argument brings the memory usage of each keepalive'd tls connection (once the process is GCed) down to <30KB -- that's excellent :)<br>
<br>
<br>
<br>
On Mon, 10 Jun 2019, at 9:51 PM, Ingela Andin wrote:<br>
> Hi!<br>
> <br>
> How do you provide your certificates to ssl? If you provide your <br>
> CA-certs as binary DER blobs to the connection they<br>
> will be stored by the connection and be local to the connection. If you <br>
> provide them through a file they will be stored<br>
> in a ETS table and maybe referenced by other connections as there is a <br>
> way to refer to them. <br>
> <br>
> Regards Ingela Erlang/OTP Team <br>
> <br>
> Den mån 10 juni 2019 kl 05:10 skrev Jamie McClymont <br>
> <<a href="mailto:jamie%2Berlang-questions@kwiius.com" target="_blank">jamie+erlang-questions@kwiius.com</a> <br>
> <mailto:<a href="mailto:jamie%252Berlang-questions@kwiius.com" target="_blank">jamie%2Berlang-questions@kwiius.com</a>>>:<br>
> > Hi all<br>
> > <br>
> >  I'm building an app which needs to be able to make a good number of concurrent HTTPS requests (ideally I could keep high-hundreds/low-thousands of idle keepalive connections open at a time with modest memory usage).<br>
> > <br>
> >  Poking around (by making concurrent requests to 50 domains), I find that holding HTTP connections is effectively free memory-wise, while holding HTTPS connections costs around 2.5MB per connection! All this memory usage is in the tls_connection:init/1 processes, according to observer.<br>
> > <br>
> >  Looking at the state of these processes, they each hold a lot of information: the extracted/decoded certificate files for all the CA certs on my system (of which there are 134!). From some cursory googling about erlang's memory model, it seems that because this data is not a binary blob but a big tree of terms, it's going to be copied to every tls_connection process.<br>
> > <br>
> >  Any pointers on if there is an existing way to mitigate this (while keeping a full set of root certs available)? Otherwise, it seems to me the reasonable solution would be to keep the CA store in a central process (ETS?) and query that for the specific root cert that the server says it is signed by. If I'll be implementing it, could someone sanity-check this approach:<br>
> >  * provide an empty list of CAs to the ssl module<br>
> >  * provide a verify_fun which matches on {bad_cert, unknown_ca} and then gets the correct CA and performs all the remaining necessary checks (whatever those are...) before returning {valid, UserState} (or {valid_peer, UserState}?)<br>
> > <br>
> > <br>
> >  Thanks<br>
> >  - Jamie<br>
> > <br>
> >  P.s. sorry if this email is a duplicate: I think my last one was silently dropped since I sent it from a different address to the one I subscribed with, but not certain.<br>
> > <br>
> >  Appendix - one of the 134 decoded certs stored by every process:<br>
> > <br>
> >  {decoded,<br>
> >  {{#Ref<0.577909663.1295777797.255240>,<br>
> >  106100277556486529736699587978573607008,<br>
> >  {rdnSequence,<br>
> >  [[{'AttributeTypeAndValue',{2,5,4,6},"CN"}],<br>
> >  [{'AttributeTypeAndValue',<br>
> >  {2,5,4,10},<br>
> >  {utf8String,<<"UniTrust">>}}],<br>
> >  [{'AttributeTypeAndValue',<br>
> >  {2,5,4,3},<br>
> >  {utf8String,<br>
> >  <<"UCA Extend"...(28 B)>>}}]]}},<br>
> >  {<<48,130,5,90,48,130,3,66,160,3...(1 kB)>>,<br>
> >  {'OTPCertificate',<br>
> >  {'OTPTBSCertificate',v3,106100277556486529736699587978573607008,<br>
> >  {'SignatureAlgorithm',{1,2,840,113549,1,1,11},'NULL'},<br>
> >  {rdnSequence,<br>
> >  [[{'AttributeTypeAndValue',{2,5,4,6},"CN"}],<br>
> >  [{'AttributeTypeAndValue',<br>
> >  {2,5,4,10},<br>
> >  {utf8String,<<"UniTrust">>}}],<br>
> >  [{'AttributeTypeAndValue',<br>
> >  {2,5,4,3},<br>
> >  {utf8String,<br>
> >  <<"UCA Extend"...(28 B)>>}}]]},<br>
> >  {'Validity',{utcTime,"150313000000Z"},{utcTime,"381231000000Z"}},<br>
> >  {rdnSequence,<br>
> >  [[{'AttributeTypeAndValue',{2,5,4,6},"CN"}],<br>
> >  [{'AttributeTypeAndValue',<br>
> >  {2,5,4,10},<br>
> >  {utf8String,<<"UniTrust">>}}],<br>
> >  [{'AttributeTypeAndValue',<br>
> >  {2,5,4,3},<br>
> >  {utf8String,<br>
> >  <<"UCA Extend"...(28 B)>>}}]]},<br>
> >  {'OTPSubjectPublicKeyInfo',<br>
> >  {'PublicKeyAlgorithm',{1,2,840,113549,1,1,1},'NULL'},<br>
> >  {'RSAPublicKey',<br>
> >  689603717979852636831081426524261160465705539154429034072886964586226830541206711367761253770112725458465044497361739659482435934368052465546153546798794021727234724250491430601994902725573258440903769572247434719710136763019389835974660379560646189661431052777862620577580627735499519427983731365873646101116220703443112119094192330629089538925644308340292126955780669276375525797477380635249258541277353787220035677250408659616695990328739419944306797836041926101961617154636604738870383637100044978431121318943912528365357866046388476749437076957867974020718613998841641003305315809368105957269212277478816744375233680463674812053558530520195020911324127390436183137612053158831455696931169855471108960460199610930021503675868841756093916690737925568854144895439113023618139270733541586805299082563244530623575372402602522085830629158312024768857183218701826386841425816972120556588392270337545276474712543306659887836405319075385033422367187135702233624763183702955559196400<br>
> >  695312060899684142798408078723091214153237781607055313585627048184929762700635100359534649156945631489915475941635189136663455081054904713071171644045263631869342706234148072080520374089220391876551645591673277270360119934713372188503089344323356273673087,<br>
> >  65537}},<br>
> >  asn1_NOVALUE,asn1_NOVALUE,<br>
> >  [{'Extension',<br>
> >  {2,5,29,14},<br>
> >  false,<br>
> >  <<217,116,58,228,48,61,13,247,18,220...(20 B)>>},<br>
> >  {'Extension',<br>
> >  {2,5,29,19},<br>
> >  true,<br>
> >  {'BasicConstraints',true,asn1_NOVALUE}},<br>
> >  {'Extension',<br>
> >  {2,5,29,15},<br>
> >  true,<br>
> >  [digitalSignature,keyCertSign,cRLSign]}]},<br>
> >  {'SignatureAlgorithm',{1,2,840,113549,1,1,11},'NULL'},<br>
> >  <<54,141,151,204,66,21,100,41,55,155...(512 B)>>}}}},<br>
> >  _______________________________________________<br>
> >  erlang-questions mailing list<br>
> > <a href="mailto:erlang-questions@erlang.org" target="_blank">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" target="_blank">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>
</blockquote></div>