[CONJ-721] Connector-J missing TLSv1.3 TLS_CHACHA20_POLY1305_SHA256 ciphersuite support; other v1.3 suites ok Created: 2019-07-28  Updated: 2019-09-12  Resolved: 2019-09-12

Status: Closed
Project: MariaDB Connector/J
Component/s: protocol, SSL, TLS
Affects Version/s: 2.4.2, 2.4.3
Fix Version/s: N/A

Type: Bug Priority: Major
Reporter: pgnd Assignee: Diego Dupin
Resolution: Not a Bug Votes: 0
Labels: None


 Description   

running

	mariadb --version
		mariadb  Ver 15.1 Distrib 10.4.7-MariaDB, for Linux (x86_64) using readline 5.1

and, Connector-J built from head

git log | head
	commit 8b2f79cf1bf77684d924018f51807d8bd3be5c49
	Author: rusher <diego.dupin@gmail.com>
	Date:   Mon Jun 17 14:42:12 2019 +0200
 
	    [misc] correction test for multi-insert value
 
	commit c160500cc2e7eb423c37cc72f2c95151e67954f5
	Merge: 94465b67 c9a86cf7
	Author: rusher <diego.dupin@gmail.com>
	Date:   Mon Jun 17 14:27:07 2019 +0200

with a MDB SSL config of

	[server]
	tls_version = TLSv1.3
	...
 
	[client]
	tls_version = TLSv1.3
	...

and an openssl 1.1.1c config defining cipher prefence order,

	/etc/ssl/openssl.cnf
		...
		[system_default_sect]
		Ciphersuites = TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256
		Options = ServerPreference,PrioritizeChaCha

on mysql client connect, the connection correctly uses TLSv1.3 protocol, and the preferred/spec'd cipher

	mysql << EOF
	 SHOW SESSION STATUS LIKE 'Ssl_version';
	 SHOW SESSION STATUS LIKE 'Ssl_cipher';
	EOF
 
		Variable_name   Value
		Ssl_version     TLSv1.3
		Ssl_cipher      TLS_CHACHA20_POLY1305_SHA256

OTOH, checking JDBC connection with sqlline, using MDB Connector-J 2.4.2's provided class,

	java -cp "/usr/local/src/sqlline/target/*:/usr/local/etc/mariadb/connector-j/*" sqlline.SqlLine .
 
		!connect jdbc:mysql://db.pgnd.lan:3306/mysql?&useSSL=true&enabledSslProtocolSuites=TLSv1.3&enabledSslCipherSuites=TLS_CHACHA20_POLY1305_SHA256&verifyServerCertificate=true&disableSslHostnameVerification=false&serverSslCert=/etc/ssl/myCA.pem.pem&jdbcCompliantTruncation=false&autoReconnect=true testuser "testpass"

connection FAILs,

	Error: Unsupported SSL cipher 'TLS_CHACHA20_POLY1305_SHA256'. Supported ciphers : TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_DSS_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_DSS_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV (state=,code=0)

If I switch to ANOTHER TLSv1.3 ciphersuite option,

	-	TLS_CHACHA20_POLY1305_SHA256
	+	TLS_AES_256_GCM_SHA384

re-checking JDBC connection with sqlline,,

	java -cp "/usr/local/src/sqlline/target/*:/usr/local/etc/mariadb/connector-j/*" sqlline.SqlLine .
 
		!connect jdbc:mysql://db.pgnd.lan:3306/mysql?&useSSL=true&enabledSslProtocolSuites=TLSv1.3&enabledSslCipherSuites=TLS_AES_256_GCM_SHA384&verifyServerCertificate=true&disableSslHostnameVerification=false&serverSslCert=/etc/ssl/myCA.pem.pem&jdbcCompliantTruncation=false&autoReconnect=true testuser "testpass"

now connects,

	0: jdbc:mysql://db.pgnd.lan:>

and uses TLSv1.3

	SHOW SESSION STATUS LIKE 'Ssl_version';
 
		Variable_name   Value
		Ssl_version     TLSv1.3

AND the preferred/spec'd cipher

	SHOW SESSION STATUS LIKE 'Ssl_cipher';
 
		Variable_name   Value
		Ssl_cipher      TLS_AES_256_GCM_SHA384



 Comments   
Comment by Diego Dupin [ 2019-07-29 ]

Java connector rely on build-in java SSL implementation.
Could you indicate java vendor and version?
If my memory is good, TLSv1.3 exist since java 11, but chacha20 cipher only since java 12.

Comment by pgnd [ 2019-07-29 ]

> Could you indicate java vendor and version?

java -version
	Picked up _JAVA_OPTIONS: -Xmx512M
	openjdk version "11.0.4" 2019-07-16
	OpenJDK Runtime Environment (build 11.0.4+11-suse-lp151.131.1-x8664)
	OpenJDK 64-Bit Server VM (build 11.0.4+11-suse-lp151.131.1-x8664, mixed mode)
 
rpm -q --whatprovides /usr/lib64/jvm/java-11-openjdk-11/bin/java
	java-11-openjdk-headless-11.0.4.0-lp151.131.1.x86_64

sourced from,

https://build.opensuse.org/package/show/Java%3AFactory/java-11-openjdk

> If my memory is good, TLSv1.3 exist since java 11, but chacha20 cipher only since java 12.

I'll start to look, but if you can verify that openjdk v11 (LTS) does NOT have chacha20 cipher, or any pending backport, but that v12 does, I can give v12 a try. It's not currently installed here, and, so far, I've no direct experience with it; unclear how it currently behaves ...

Comment by pgnd [ 2019-07-29 ]

fyi,

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8140466

it appears it's "in" JDK11,

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8153029

Comment by Diego Dupin [ 2019-07-29 ]

It seems TLS_CHACHA20_POLY1305_SHA256 has only been added in JDK12 :

see openjdk 11 cipher suite: https://docs.oracle.com/en/java/javase/11/docs/specs/security/standard-names.html#jsse-cipher-suite-names only contain TLSv1.2 CHACHA20 chiphers.

openjdk 12 does have TLSv1.3 TLS_CHACHA20_POLY1305_SHA256 cipher : https://docs.oracle.com/en/java/javase/12/docs/specs/security/standard-names.html#jsse-cipher-suite-names
So you must go for openjdk 12 (non LTS) in order to do that

Comment by pgnd [ 2019-07-29 ]

with

	java -version
		openjdk version "12.0.2" 2019-07-16
		OpenJDK Runtime Environment (build 12.0.2+9-suse-lp151.40.1-x8664)
		OpenJDK 64-Bit Server VM (build 12.0.2+9-suse-lp151.40.1-x8664, mixed mode)

using sqlline+connector-j, as above,

java -cp "/usr/local/src/sqlline/target/*:/usr/local/etc/mariadb/connector-j/*" sqlline.SqlLine .

Selecting client TLSv1.3/TLS_CHACHA20_POLY1305_SHA256 connection

	!connect jdbc:mysql://db.pgnd.lan:3306/mysql?&useSSL=true&enabledSslProtocolSuites=TLSv1.3&enabledSslCipherSuites=TLS_CHACHA20_POLY1305_SHA256&verifyServerCertificate=true&disableSslHostnameVerification=false&serverSslCert=/etc/ssl/myCA.pem.pem&jdbcCompliantTruncation=false&autoReconnect=true testuser "testpass"

DOES, now, connect correctly,

	0: jdbc:mysql://db.pgnd.lan:>

and uses TLSv1.3

	SHOW SESSION STATUS LIKE 'Ssl_version';
		Variable_name   Value
		Ssl_version     TLSv1.3

AND the preferred/spec'd cipher

	SHOW SESSION STATUS LIKE 'Ssl_cipher';
		Variable_name   Value
		Ssl_cipher      TLS_CHACHA20_POLY1305_SHA256

I'm unclear what that "fixed for 11b7" tag means :-/

One hopes that this gets backported to JDK 11/LTS.

Comment by Diego Dupin [ 2019-09-12 ]

Closing, since relating to java implementation, not driver

Generated at Thu Feb 08 03:17:49 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.