Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Por que o Java não pode se conectar ao MySQL 5.7 após a atualização mais recente do JDK e como isso deve ser corrigido? (ssl.SSLHandshakeException:nenhum protocolo apropriado)


Como @skelwa já comentou, você precisará adicionar o enabledTLSProtocols=TLSv1.2 propriedade de configuração na cadeia de conexão para resolver seu problema.

Uma string de conexão completa para Connector/J poderia ficar assim:
jdbc:mysql://<host>:<port>/<dbname>?enabledTLSProtocols=TLSv1.2

Para r2dbc você precisará usar tlsVersion=TLSv1.2 em vez de.

A pergunta que fica é:

Por que o JDK e o MySQL simplesmente não concordam em usar TLSv1.2 ?

Embora ambas as partes realmente suportem TLSv1.2, o problema que você estava enfrentando é apresentado pelo comportamento padrão do Connector/J. Por motivos de compatibilidade, o Connector/J não habilita o TLSv1.2 e superior por padrão. Portanto, é preciso habilitá-lo explicitamente.

Consulte a seguinte nota :

AVISO: esteja ciente de que soluções sugerindo a edição de jdk.tls.disabledAlgorithms dentro de jre/lib/security representam um risco de segurança ao seu aplicativo e alterar qualquer coisa pode ter implicações graves! Existem razões pelas quais esses protocolos foram desabilitados e não se deve simplesmente remover tudo ou mesmo apenas partes dessa lista.

Observação: se você quiser obter mais insights de baixo nível do JDK para depurar seu problema, você pode habilitar logs de depuração ssl passando a seguinte configuração para o comando java:

-Djavax.net.debug=ssl,handshake ou mesmo-Djavax.net.debug=all

No seu caso, você verá algo como:
...(HANDSHAKE_FAILURE): Couldn't kickstart handshaking (
"throwable" : {
  javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
    at java.base/sun.security.ssl.HandshakeContext.<init>(HandshakeContext.java:170)
    at java.base/sun.security.ssl.ClientHandshakeContext.<init>(ClientHandshakeContext.java:98)
    ...