Hello!

On Mon, May 13, 2019 at 08:16:13AM +0200, Elias Ohm via nginx-devel wrote:

>  src/event/ngx_event_openssl_stapling.c |  10 ++++++++--
>  1 files changed, 8 insertions(+), 2 deletions(-)
> 
> 
> # HG changeset patch
> # User Elias Ohm <e...@novomind.com>
> # Date 1557697215 -7200
> #      Sun May 12 23:40:15 2019 +0200
> # Node ID 6c1d44aa7054fb130ece5432119d04971b586795
> # Parent  16a1adadf43751f59257ba419f6bacd530dd19d3
> fix/unify access to SSL_CTX certificate chains
> 
> for newer OpenSSL versions (1.0.2+) the chain is stored in the dedicated 
> chain field (SSL_CTX_set0_chain_certs) belonging to a certificate while in 
> older versions the extra_chain had to be used (SSL_CTX_add_extra_chain_cert) 
> which is always global to the context.
> 
> reading the chain is still implemented with SSL_CTX_get_extra_chain_certs for 
> newer versions (if not directly from staple->ssl_ctx->extra_certs in older 
> versions).
> however, this works for OpenSSL where the SSL_CTX_get_extra_chain_certs falls 
> back to read chain_certs when no extra_certs are available but breaks for 
> some other implementations where SSL_CTX_get_extra_chain_certs is implemented 
> as SSL_CTX_get_extra_chain_certs_only in OpenSSL is implemented. in addition 
> this is inconsistent use of the functions and the functionality of trying 
> etxra certs and falling back to certifiactes chain is not needed here.

You may want to be more specific here:

LibreSSL 2.9.1 introduced partial support for per-certificate 
chains, yet failed to introduce appropriate changes in 
SSL_CTX_get_extra_chain_certs().  Quoting documentation for 
SSL_CTX_get_extra_chain_certs(), as recently added to OpenSSL[1]:

: SSL_CTX_get_extra_chain_certs() retrieves the extra chain 
: certificates associated with ctx, or the chain associated with the 
: current certificate of ctx if the extra chain is empty.

This behaviour was in OpenSSL since original introduction of 
per-certificate chains in OpenSSL 1.0.2[2], so a code can safely 
use SSL_CTX_get_extra_chain_certs() to get the best of the 
available chains regardless of how certificate chains were set.  
And this is what the code in question in nginx does - it uses 
SSL_CTX_get_extra_chain_certs() to get the best of the available 
chains.

While I generally like LibreSSL, this looks like a LibreSSL bug to 
me.  And instead of trying to fix working code in nginx, you may 
want to focus on fixing SSL_CTX_get_extra_chain_certs() in 
LibreSSL.

[1] 
https://github.com/openssl/openssl/commit/dc703d6b469f1b186483a55b59013fbaca2228fd
[2] 
https://github.com/openssl/openssl/commit/a51f767645c117667d337f77fe1dd9c0a66d8410

-- 
Maxim Dounin
http://mdounin.ru/
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel

Reply via email to