Percebemos que um aplicativo Java, o Metabase, está apresentando um erro ao se conectar ao SQL Server 2016 e, com a mesma configuração, o problema acontece no Red Hat Enterprise Linux 9, mas não no Red Hat Enterprise Linux 7. Então, esperamos obter ajuda para confirmar se o problema é devido ao sistema operacional e corrigi-lo.
História mais longa:
Estamos testando uma instância atualizada do Metabase, e os componentes atualizados incluem
- Sistema operacional Red Hat Enterprise Linux (de v7 a v9),
- Java (de 11 a 21) e
- Software Metabase (da v0.32.x até a atual v0.50.x).
E notamos o seguinte erro na instância atualizada ao conectar a uma fonte de dados do SQL Server 2016.
A propriedade "encrypt" está definida como "false" e a propriedade "trustServerCertificate" está definida como "false", mas o driver não conseguiu estabelecer uma conexão segura com o SQL Server usando a criptografia Secure Sockets Layer (SSL): Erro: Os certificados não estão em conformidade com as restrições do algoritmo. ClientConnectionId:6bf62750-d5c4-49c5-8ada-4253d8b55055
Suspeitamos que o erro esteja relacionado ao comportamento do sistema do Red Hat Enterprise Linux 9, portanto, projetamos o seguinte caso de teste simplificado para dar suporte ao nosso ponto:
Configuração de teste:
- Java openjdk v11.0.23
- metabase.jar v0.32.5
Iniciamos o aplicativo chamando o comando java -jar metabase.jar
, para que ele inicie uma nova instância de demonstração do Metabase em execução no H2 local para o banco de dados do aplicativo.
Em seguida, tentamos adicionar uma fonte de dados do SQL Server 2016 configurada com criptografia não necessária.
Executando no Red Hat Enterprise Linux 7, o teste acima foi bem-sucedido. No entanto, executando no Red Hat Enterprise Linux 9, ele falhou com os seguintes eventos de log, observe o timestamp de 12-19 14:58:44
:
12-19 14:58:09 DEBUG middleware.log :: GET /api/setup/admin_checklist 200 14 ms (10 DB calls) Jetty threads: 8/50 (3 busy, 5 idle, 0 queued) (48 total active threads)
12-19 14:58:44 INFO metabase.driver :: Initializing driver :sqlserver...
12-19 14:58:44 DEBUG plugins.classloader :: Setting current thread context classloader to shared classloader clojure.lang.DynamicClassLoader@1dc9fc0...
12-19 14:58:44 INFO plugins.classloader :: Added URL file:/data/metabase-test/v0.32.5/plugins/sqlserver.metabase-driver.jar to classpath
12-19 14:58:44 DEBUG plugins.init-steps :: Loading plugin namespace metabase.driver.sqlserver...
12-19 14:58:44 INFO metabase.driver :: Registered driver :sqlserver (parents: :sql-jdbc) 🚚
12-19 14:58:44 DEBUG plugins.jdbc-proxy :: Registering JDBC proxy driver for class com.microsoft.sqlserver.jdbc.SQLServerDriver...
Load lazy loading driver :sqlserver took 173 ms
12-19 14:58:44 DEBUG middleware.log :: POST /api/database 400 314 ms (0 DB calls) Jetty threads: 8/50 (3 busy, 4 idle, 0 queued) (45 total active threads)
{:valid false,
:dbname
"com.microsoft.sqlserver.jdbc.SQLServerException: The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: \"Certificates do not conform to algorithm constraints\". ClientConnectionId:ca179b99-b3b3-4351-a0de-736b7dc8e765",
:message
"com.microsoft.sqlserver.jdbc.SQLServerException: The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: \"Certificates do not conform to algorithm constraints\". ClientConnectionId:ca179b99-b3b3-4351-a0de-736b7dc8e765"}
12-19 14:58:44 DEBUG middleware.log :: GET /api/database 200 5 ms (3 DB calls) Jetty threads: 8/50 (3 busy, 4 idle, 0 queued) (45 total active threads)
12-19 15:00:00 INFO task. Send-pulses :: Sending scheduled pulses...
Gostaríamos de saber se esquecemos de algo em relação ao novo sistema operacional e agradecemos muito quaisquer dicas e sugestões.
Informações adicionais
Sobre o TLS:
O SQL Server 2016 em teste não tem certificado SSL instalado e está configurado como "criptografia não necessária".
- Verificamos o host do Windows no contexto de "SQLServerManager13.msc > SQL Server Network Configuration > Protocols for MSSQLSERVER > Properties". O "Force Encryption" é
No
, e não há nada na aba "Certificate". - O comando
openssl s_client
produz os seguintes resultados:# openssl s_client -connect <sql-server-hostname>:1433 -showcerts Connecting to xxx.xxx.xxx.xxx CONNECTED(00000003) 001EA5D0C87F0000:error:0A000126:SSL routines::unexpected eof while reading:ssl/record/rec_layer_s3.c:689: --- no peer certificate available --- No client certificate CA names sent --- SSL handshake has read 0 bytes and written 309 bytes Verification: OK --- New, (NONE), Cipher is (NONE) This TLS version forbids renegotiation. Compression: NONE Expansion: NONE No ALPN negotiated Early data was not sent Verify return code: 0 (ok) ---
Sobre a versão do SQL Server:
Com tudo igual para executar o Metabase, testamos adicionar uma fonte de dados no SQL Server 2022 em vez do 2016, e o teste foi aprovado no RHEL9.
Sobre as diferenças em java. Security
:
Recuperamos os java.security
arquivos do RHEL7 e do RHEL9, depois filtramos os comentários e espaços em branco para obter o conteúdo líquido. Comparando os dois arquivos, obtivemos uma série de diferenças abaixo.