<div dir="ltr">Hi,<br><br>Can anyone explain reasons behind default implementations of verify_fun function<br>in the ssl application? Particularly the "extensions" part.<br><br>According to the documentation (<a href="https://erlang.org/doc/man/ssl.html#type-custom_verify">https://erlang.org/doc/man/ssl.html#type-custom_verify</a>)<br>default implementations are:<br><br>"Default option verify_fun in verify_peer mode:<br><br>{fun(_,{bad_cert, _} = Reason, _) -><br>   {fail, Reason};<br>    (_,{extension, _}, UserState) -><br>    {unknown, UserState};<br>    (_, valid, UserState) -><br>      {valid, UserState};<br>    (_, valid_peer, UserState) -><br>         {valid, UserState}<br> end, []}<br><br><br>Default option verify_fun in mode verify_none:<br><br>{fun(_,{bad_cert, _}, UserState) -><br>       {valid, UserState};<br>    (_,{extension, #'Extension'{critical = true}}, UserState) -><br>    {valid, UserState};<br>    (_,{extension, _}, UserState) -><br>        {unknown, UserState};<br>    (_, valid, UserState) -><br>      {valid, UserState};<br>    (_, valid_peer, UserState) -><br>         {valid, UserState}<br> end, []}<br>"<br><br>Why's with verify_peer mode all extensions are treated as "unknown" and <br>for verify_none only critical extensions are treated as valid?<br>I understand that according to RFC5280 any extension can be inserted into the<br>certificate and of course those "any" extensions are "unknown". <br><br>But RFC5280 also describes extensions which can be considered as standard, <br>for example: keyUsage and extKeyUsage. Why those "standard" extensions are <br>"unknown" too?<br><br>Why am I forced to write my own verify_fun even for "standard" extensions.<br><br>In practice my problem is this.<br>I have my own written CA which issues certificates.<br>Certificates are: <br>    Root CA -> <br>        Intermediate Root CA -> <br>            Web server certificate<br>            Client certificate.<br><br>Server-Client interaction required to have two-way authentication.<br><br>Client certificate has extKeyUsage with value id-kp-clientAuth and marked as critical. <br>Web server's certificate is used with cowboy web server.<br>Client's certificate is used with curl (for testing purposes) like this:<br>curl  --insecure -v <br>    --key-type der <br>    --key ./client.key <br>    --cert-type der <br>    --cert ./client.cer <br>    --cacert ./ca_cert.pem <a href="https://localhost:8443">https://localhost:8443</a><br><br>And when extKeyUsage is marked as critical, the connection could not be established.<br>Curl's output:<br>--------------------------------------------------------------------------------<br>* connect to ::1 port 8443 failed: Connection refused<br>*   Trying 127.0.0.1...<br>* TCP_NODELAY set<br>* Expire in 149996 ms for 3 (transfer 0x55a42be3efb0)<br>* Connected to localhost (127.0.0.1) port 8443 (#0)<br>* ALPN, offering h2<br>* ALPN, offering http/1.1<br>* successfully set certificate verify locations:<br>*   CAfile: ./ca_cert.pem<br>  CApath: /etc/ssl/certs<br>* TLSv1.3 (OUT), TLS handshake, Client hello (1):<br>* TLSv1.3 (IN), TLS handshake, Server hello (2):<br>* TLSv1.2 (IN), TLS handshake, Certificate (11):<br>* TLSv1.2 (IN), TLS handshake, Server key exchange (12):<br>* TLSv1.2 (IN), TLS handshake, Request CERT (13):<br>* TLSv1.2 (IN), TLS handshake, Server finished (14):<br>* TLSv1.2 (OUT), TLS handshake, Certificate (11):<br>* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):<br>* TLSv1.2 (OUT), TLS handshake, CERT verify (15):<br>* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):<br>* TLSv1.2 (OUT), TLS handshake, Finished (20):<br>* TLSv1.2 (IN), TLS alert, unknown CA (560):<br>* error:14094418:SSL routines:ssl3_read_bytes:tlsv1 alert unknown ca<br>* Closing connection 0<br>curl: (35) error:14094418:SSL routines:ssl3_read_bytes:tlsv1 alert unknown ca<br>--------------------------------------------------------------------------------<br><br>Cowboy's output:<br>--------------------------------------------------------------------------------<br>1> =NOTICE REPORT==== 1-Jul-2021::12:47:25.204660 ===<br>TLS server: In state certify at ssl_handshake.erl:1887 generated SERVER ALERT: Fatal - Unknown CA<br>--------------------------------------------------------------------------------<br><br><br><br><br></div>