Hi Adriaan,

Adriaan de Jong wrote:
-----Original Message-----
From: Jan Just Keijser [mailto:janj...@nikhef.nl]
Hi Samuli, David, list,

What some people get confused about is a stacked certificate vs a
certificate chain: OpenVPN only supports stacked CA certificates,
meaning that any of the certs present in the stacked file are
considered
trusted.
What some people want is a certificate chain, like some websites use:
the website has a server certificate signed by a sub-CA which in turn
is
signed by Verisign. The webserver sends the entire chain (server cert +
sub-CA cert + verisign cert) to the client for verification. That way
the client only needs the Verisign cert to trust a particular website
(the Verisign CA cert is installed in most browser by default). OpenVPN
does not support this at the moment. It would require changing
  SSL_CTX_use_certificate()
to
  SSL_CTX_use_certificate_chain()
to ensure that the entire certificate chain is sent to the remote end
(client or server).

I think SSL_CTX_use_certificate_chain_file() is actually used when loading the 
certificate from a separate cert file. It's just slightly confusing due to the 
fact that it is loaded twice:

- SSL_CTX_use_certificate_file is used here:
http://openvpn.git.sourceforge.net/git/gitweb.cgi?p=openvpn/openvpn-testing.git;a=blob;f=ssl.c;h=a1268ac2a9291dc1512fa28e3ab4efc65085c952;hb=HEAD#l1639

- SSL_CTX_use_certificate_chain_file is used here:
  
http://openvpn.git.sourceforge.net/git/gitweb.cgi?p=openvpn/openvpn-testing.git;a=blob;f=ssl.c;h=a1268ac2a9291dc1512fa28e3ab4efc65085c952;hb=HEAD#l1738

I'm not entirely sure whether I'm right, and why things are done this way. Does 
anyone know the reasoning behind this?


ah mea culpa - I did not read the rest of the init_ssl function. It does seem a bit odd though:

this happens first (2.1.3 code base):
1623 if (!SSL_CTX_use_certificate_file (ctx, options->cert_file, SSL_FILETYPE_PEM)) 1624 msg (M_SSLERR, "Cannot load certificate file %s", options->cert_file);
1625           using_cert_file = true;

so we load the cert and we set 'using_cert_file = true' . Then later:
1721   /* Enable the use of certificate chains */
1722   if (using_cert_file)
1723     {
1724 if (!SSL_CTX_use_certificate_chain_file (ctx, options->cert_file)) 1725 msg (M_SSLERR, "Cannot load certificate chain file %s (SSL_use_certificate_chain_file)", options->cert_file);
1726     }

so the certificate is loaded again but now using _use_certificate_chain ! It does suggest that you can use certificate chains , however.

I just tested a setup where the client cert is a concatenation of the client cert + intermediate CA. The client sends these certs to a server which only trusts the "root" CA (i.e. the one that signed the intermediate CA to begin with) but I cannot connect. It seems the 'verify_callback' function does not work with certificate chains (yet) : only the top level cert is inspected.

to be continued...

cheers,

JJK








Reply via email to