https://bz.apache.org/bugzilla/show_bug.cgi?id=67628

            Bug ID: 67628
           Summary: OpenSSLCipherConfigurationParser#parse() produces
                    misleading false positive cipher warnings
           Product: Tomcat 8
           Version: 8.5.x-trunk
          Hardware: All
                OS: All
            Status: NEW
          Severity: major
          Priority: P2
         Component: Connectors
          Assignee: dev@tomcat.apache.org
          Reporter: micha...@apache.org
  Target Milestone: ----

This likely happens in all maintained versions I have just observed this in
8.5.94-dev. This one tooks me some hours to understand and analyze, after
7129db33aa2797b8da17a9aeffeedfafdc725e7a I see false positive warnings which
are almost impossible to analyze for many users.

I am running off Java 8 and OpenSSL 1.1.1t (HP-UX), 1.1.1w-freebsd/3.0.11
(FreeBSD).

Consider the following config in server.xml:
> <SSLHostConfig hostName="..." protocols="TLSv1.2+TLSv1.3"
>   honorCipherOrder="true" disableSessionTickets="true"
>   
> ciphers="HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK:!DSS:!SHA1:!SHA256:!SHA384">
>     <Certificate certificateFile="..." certificateKeyFile="..." 
> certificateKeyPassword="..." type="RSA" />
> </SSLHostConfig>

Suddenly I see the following warning:
> 2023-10-05T21:36:05.274 WARNUNG [main] 
> org.apache.tomcat.util.net.SSLUtilBase.getEnabled Some of the specified 
> [ciphers] are not supported by the SSL engine and have been skipped: 
> [[TLS_DH_DSS_WITH_AES_256_GCM_SHA384, TLS_DH_RSA_WITH_AES_256_GCM_SHA384, 
> TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384, 
> TLS_AES_128_CCM_SHA256, TLS_DH_DSS_WITH_AES_128_GCM_SHA256, 
> TLS_DH_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, 
> TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256]]

I have started diffing my config back and forth, but wasn't able to spot the
issue comparing my cipher expression compared to ALL. Added the following diff
to better understand the issue:
> diff --git a/java/org/apache/tomcat/util/net/SSLUtilBase.java 
> b/java/org/apache/tomcat/util/net/SSLUtilBase.java
> index d300737f69..7f62a18ca7 100644
> --- a/java/org/apache/tomcat/util/net/SSLUtilBase.java
> +++ b/java/org/apache/tomcat/util/net/SSLUtilBase.java
> @@ -175,0 +176,1 @@ public abstract class SSLUtilBase implements SSLUtil {
> +        log.info("[" + name + "] with configured: " + configured + ", 
> implemented: " + implemented + ", enabled: " + enabled);

Still doesn't work out for me. Looking at SslUtilBase:
>        List<String> configuredCiphers = sslHostConfig.getJsseCipherNames();
>        Set<String> implementedCiphers = getImplementedCiphers();

Returns false data! While #getImplementedCiphers() truly returns the
implemented ciphers by the underlying OpenSSL version,
sslHostConfig.getJsseCipherNames() does NOT invoke OpenSSL at all. It invokes
"OpenSSLCipherConfigurationParser.parse(getCiphers());" which gives me:
> TLS_AES_128_CCM_SHA256
> TLS_AES_128_GCM_SHA256
> TLS_AES_256_GCM_SHA384
> TLS_CHACHA20_POLY1305_SHA256
> TLS_DHE_RSA_WITH_AES_128_CCM
> TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
> TLS_DHE_RSA_WITH_AES_256_CCM
> TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
> TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256
> TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384
> TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
> TLS_DH_DSS_WITH_AES_128_GCM_SHA256
> TLS_DH_DSS_WITH_AES_256_GCM_SHA384
> TLS_DH_RSA_WITH_AES_128_GCM_SHA256
> TLS_DH_RSA_WITH_AES_256_GCM_SHA384
> TLS_ECDHE_ECDSA_WITH_AES_128_CCM
> TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
> TLS_ECDHE_ECDSA_WITH_AES_256_CCM
> TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
> TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256
> TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384
> TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
> TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
> TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
> TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256
> TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384
> TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
> TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
> TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
> TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
> TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
> TLS_RSA_WITH_AES_128_CCM
> TLS_RSA_WITH_AES_128_GCM_SHA256
> TLS_RSA_WITH_AES_256_CCM
> TLS_RSA_WITH_AES_256_GCM_SHA384
> TLS_RSA_WITH_ARIA_128_GCM_SHA256
> TLS_RSA_WITH_ARIA_256_GCM_SHA384

The parsing and IANA mapping is done by Tomcat, NOT OpenSSL. Now let's invoke
OpenSSL:
> # openssl version
> OpenSSL 1.1.1t  7 Feb 2023
> # openssl ciphers -stdname 
> 'HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK:!DSS:!SHA1:!SHA256:!SHA384'
>  | cut -d ' ' -f 1 | sort
> TLS_AES_128_GCM_SHA256
> TLS_AES_256_GCM_SHA384
> TLS_CHACHA20_POLY1305_SHA256
> TLS_DHE_RSA_WITH_AES_128_CCM
> TLS_DHE_RSA_WITH_AES_128_CCM_8
> TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
> TLS_DHE_RSA_WITH_AES_256_CCM
> TLS_DHE_RSA_WITH_AES_256_CCM_8
> TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
> TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256
> TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384
> TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
> TLS_ECDHE_ECDSA_WITH_AES_128_CCM
> TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
> TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
> TLS_ECDHE_ECDSA_WITH_AES_256_CCM
> TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
> TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
> TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256
> TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384
> TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
> TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
> TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
> TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256
> TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384
> TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
> TLS_RSA_WITH_AES_128_CCM
> TLS_RSA_WITH_AES_128_CCM_8
> TLS_RSA_WITH_AES_128_GCM_SHA256
> TLS_RSA_WITH_AES_256_CCM
> TLS_RSA_WITH_AES_256_CCM_8
> TLS_RSA_WITH_AES_256_GCM_SHA384
> TLS_RSA_WITH_ARIA_128_GCM_SHA256
> TLS_RSA_WITH_ARIA_256_GCM_SHA384
> $ openssl version
> OpenSSL 1.1.1w-freebsd  11 Sep 2023
> $ openssl ciphers -stdname 
> 'HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK:!DSS:!SHA1:!SHA256:!SHA384'
>  | cut -d ' ' -f 1 | sort
> TLS_AES_128_GCM_SHA256
> TLS_AES_256_GCM_SHA384
> TLS_CHACHA20_POLY1305_SHA256
> TLS_DHE_RSA_WITH_AES_128_CCM
> TLS_DHE_RSA_WITH_AES_128_CCM_8
> TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
> TLS_DHE_RSA_WITH_AES_256_CCM
> TLS_DHE_RSA_WITH_AES_256_CCM_8
> TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
> TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256
> TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384
> TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
> TLS_ECDHE_ECDSA_WITH_AES_128_CCM
> TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
> TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
> TLS_ECDHE_ECDSA_WITH_AES_256_CCM
> TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
> TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
> TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256
> TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384
> TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
> TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
> TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
> TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256
> TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384
> TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
> TLS_RSA_WITH_AES_128_CCM
> TLS_RSA_WITH_AES_128_CCM_8
> TLS_RSA_WITH_AES_128_GCM_SHA256
> TLS_RSA_WITH_AES_256_CCM
> TLS_RSA_WITH_AES_256_CCM_8
> TLS_RSA_WITH_AES_256_GCM_SHA384
> TLS_RSA_WITH_ARIA_128_GCM_SHA256
> TLS_RSA_WITH_ARIA_256_GCM_SHA384
> $ openssl version
> OpenSSL 3.0.11 19 Sep 2023 (Library: OpenSSL 3.0.11 19 Sep 2023)
> $ openssl ciphers -stdname 
> 'HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK:!DSS:!SHA1:!SHA256:!SHA384'
>  | cut -d ' ' -f 1 | sort
> TLS_AES_128_GCM_SHA256
> TLS_AES_256_GCM_SHA384
> TLS_CHACHA20_POLY1305_SHA256
> TLS_DHE_RSA_WITH_AES_128_CCM
> TLS_DHE_RSA_WITH_AES_128_CCM_8
> TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
> TLS_DHE_RSA_WITH_AES_256_CCM
> TLS_DHE_RSA_WITH_AES_256_CCM_8
> TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
> TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
> TLS_ECDHE_ECDSA_WITH_AES_128_CCM
> TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
> TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
> TLS_ECDHE_ECDSA_WITH_AES_256_CCM
> TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
> TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
> TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
> TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
> TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
> TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
> TLS_RSA_WITH_AES_128_CCM
> TLS_RSA_WITH_AES_128_CCM_8
> TLS_RSA_WITH_AES_128_GCM_SHA256
> TLS_RSA_WITH_AES_256_CCM
> TLS_RSA_WITH_AES_256_CCM_8
> TLS_RSA_WITH_AES_256_GCM_SHA384

On Windows, compiled according to our instruction and patches:
> PS> .\openssl version
> OpenSSL 1.1.1w  11 Sep 2023
> PS> .\openssl ciphers -stdname  
> 'HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK:!DSS:!SHA1:!SHA256:!SHA384'
>  | foreach-object { $_.split(" ")[0]} | sort-object
> TLS_AES_128_GCM_SHA256
> TLS_AES_256_GCM_SHA384
> TLS_CHACHA20_POLY1305_SHA256
> TLS_DHE_RSA_WITH_AES_128_CCM
> TLS_DHE_RSA_WITH_AES_128_CCM_8
> TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
> TLS_DHE_RSA_WITH_AES_256_CCM
> TLS_DHE_RSA_WITH_AES_256_CCM_8
> TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
> TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256
> TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384
> TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
> TLS_ECDHE_ECDSA_WITH_AES_128_CCM
> TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
> TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
> TLS_ECDHE_ECDSA_WITH_AES_256_CCM
> TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
> TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
> TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256
> TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384
> TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
> TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
> TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
> TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256
> TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384
> TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
> TLS_RSA_WITH_AES_128_CCM
> TLS_RSA_WITH_AES_128_CCM_8
> TLS_RSA_WITH_AES_128_GCM_SHA256
> TLS_RSA_WITH_AES_256_CCM
> TLS_RSA_WITH_AES_256_CCM_8
> TLS_RSA_WITH_AES_256_GCM_SHA384
> TLS_RSA_WITH_ARIA_128_GCM_SHA256
> TLS_RSA_WITH_ARIA_256_GCM_SHA384
> PS> .\openssl version
> OpenSSL 3.0.11 19 Sep 2023 (Library: OpenSSL 3.0.11 19 Sep 2023)
> PS> .\openssl ciphers -stdname  
> 'HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK:!DSS:!SHA1:!SHA256:!SHA384'
>  | foreach-object { $_.split(" ")[0]} | sort-object
> TLS_AES_128_GCM_SHA256
> TLS_AES_256_GCM_SHA384
> TLS_CHACHA20_POLY1305_SHA256
> TLS_DHE_RSA_WITH_AES_128_CCM
> TLS_DHE_RSA_WITH_AES_128_CCM_8
> TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
> TLS_DHE_RSA_WITH_AES_256_CCM
> TLS_DHE_RSA_WITH_AES_256_CCM_8
> TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
> TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256
> TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384
> TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
> TLS_ECDHE_ECDSA_WITH_AES_128_CCM
> TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
> TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
> TLS_ECDHE_ECDSA_WITH_AES_256_CCM
> TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
> TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
> TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256
> TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384
> TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
> TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
> TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
> TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256
> TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384
> TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
> TLS_RSA_WITH_AES_128_CCM
> TLS_RSA_WITH_AES_128_CCM_8
> TLS_RSA_WITH_AES_128_GCM_SHA256
> TLS_RSA_WITH_AES_256_CCM
> TLS_RSA_WITH_AES_256_CCM_8
> TLS_RSA_WITH_AES_256_GCM_SHA384
> TLS_RSA_WITH_ARIA_128_GCM_SHA256
> TLS_RSA_WITH_ARIA_256_GCM_SHA384

OpenSSL gives us less ciphers than the Tomcat parser. So whetever I have
requested from OpenSSL and verified on the command line is not what is passed
to OpenSSL. This is confusing and not documented (?). Especially because I have
excluded DSS explicitly, but it is back with a warning.

----------

Ideally

(a) either the data is retrieved live from OpenSSL,
(b) or documentation and log message somehow depict that this might not always
be correct.

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to