当前位置: 首页 > 知识库问答 >
问题:

使用SSL的MySQL JDBC加密

林浩漫
2023-03-14

MySQL Server(在Red Hat 7 OS上运行的远程机器,MySQL版本为5.7.11)启用了SSL,如下所示:

+---------------+--------------------------------+
| Variable_name | Value                          |
+---------------+--------------------------------+
| have_openssl  | YES                            |
| have_ssl      | YES                            |
| ssl_ca        | /var/lib/mysql/ca.pem          |
| ssl_capath    |                                |
| ssl_cert      | /var/lib/mysql/server-cert.pem |
| ssl_cipher    |                                |
| ssl_crl       |                                |
| ssl_crlpath   |                                |
| ssl_key       | /var/lib/mysql/server-key.pem  |

我试图从我的本地计算机(windows)使用SSL(而不是身份验证)建立JDBC加密。下面是这样做的JDBC代码:

import java.sql.*;

public class MysqlConnect
{
    public static void main (String[] args)
    {
        try
        {
            //System.setProperty("javax.net.ssl.trustStore", "cacerts");
            //System.setProperty("javax.net.ssl.trustStorePassword", "changeit");    ( Works with truststore values , but gives the error below without it)
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            String url = "jdbc:mysql://IPAddress:3306/DBName?
            verifyServerCertificate=false&useSSL=true&requireSSL=true";
            String user = "root";
            String password = "password";
            Connection con = DriverManager.getConnection(url,user,password);
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

我已按照此链接创建证书:https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.html。现在,如果我将服务器证书添加到C:\Program Files\Java\jdk1.8\jre\lib\Security\cacerts并使用此信任库,我确实会在wireshark中看到加密的连接,但是如果我不提供信任库名称和密码,我会得到以下错误(The我这样做的原因是,根据我的理解,与ssl身份验证不同,使用ssl的jdbc加密不应该需要客户端信任库参数):

javax.net.ssl.SSLHandshakeException
MESSAGE: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

STACKTRACE:

javax.net.ssl.SSLHandshakeException: 
sun.security.validator.ValidatorException: PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source) .

我的问题是,即使尝试仅使用ssl(而不是ssl身份验证)进行jdbc加密,是否也需要将服务器证书添加到客户端信任库(并提供信任库详细信息)?。

我已经看到了这个相关链接:

JDBC参数验证服务器证书=假连接,不需要clientkeystore和信任库

但是,我仍然得到的错误,验证服务器证书=假(它是依赖于MySQL版本或使用自签名证书)?

共有2个答案

计燕七
2023-03-14

使用SSL的JDBC加密不应要求客户端信任库参数

你凭什么这么想?你搞错了。如果您使用的是自签名证书,则确实如此。

魏熠彤
2023-03-14

代码从不同的系统工作正常,我可以建立一个安全的连接,确切的原因是为什么它失败仍然未知,但这是我的假设-

如果有人面临类似的问题,您可以尝试重新创建服务器证书并重新启动数据库服务器,出于理智的目的,从信任库中删除相应的证书或创建并使用新的信任库。

在wireshark中,您应该看到如下内容:

1   source IP   Dest IP TLSv1.2 220 Client Hello
2   Dest IP     source IP TLSv1.2   1140    Server Hello, Certificate, Server Key Exchange, Server Hello Done
3   source IP   Dest IP TLSv1.2 129 Client Key Exchange
4   source IP   Dest IP TLSv1.2 60  Change Cipher Spec
5   source IP   Dest IP TLSv1.2 99  Encrypted Handshake Message

如果您在wireshark中看到这一点,这意味着您现在通过ssl enycrypted链接进行连接(显然这只是一种解决方法,因为这种行为的根本原因尚不清楚)。

 类似资料:
  • Apache Kafka允许客户端通过SSL进行连接。默认情况下,SSL被禁用,但可以根据需要启用。 为每个Kafka broker生成SSL密钥和证书部署一个或多个支持SSL的brokers的第一步是为集群中的每台计算机生成密钥和证书。你可以使用Java的keytool实用程序来完成此任务。最初我们将生成一个临时密钥库的密钥,以便我们稍后可以导出并用CA签名。 keytool -

  • 今天数据隐私是一个十分关注的问题,作为开发人员,我们需要准备好解决这个问题。至少我们需要熟悉加密协议 SSL 和 TLS 等之上的其他协议实现数据安全。作为一个 HTTPS 网站的用户,你是安全。当然,这些协议是广泛不基于 http 的应用程序,例如安全SMTP(SMTPS)邮件服务,甚至关系数据库系统。 为了支持 SSL/TLS,Java 提供了 javax.net.ssl API 的类SslC

  • Apache HTTP服务器的mod_ssl模块提供了对使用安全套接层(Secure Sockets Layer)和传输层安全(Transport Layer Security)协议的OpenSSL库的接口。此模块和本文都是基于 Ralf S. Engelschall 的mod_ssl项目。 文档 简介 兼容性 如何... 常见问题解答 词汇表 mod_ssl 此模块提供的有关指令和环境变量的文档

  • 问题内容: 我正在尝试使用我的SSL证书运行socket.io,但是它将无法连接。 我基于聊天示例创建代码: 如果我删除SSL代码,它运行正常,但是与此同时,我收到了一个请求,请求http://domain.com/socket.io/1/?t=1309967919512 请注意,它没有尝试使用https,这会导致它失败。 我正在测试chrome,因为它是该应用程序的目标浏览器。 抱歉,这是一个简

  • 我试图找到WebClient使用的示例。 我的目标是使用Spring5 WebClient使用https和自签名证书查询REST服务 有什么例子吗?

  • 问题内容: 以下代码可以正常工作: 如果我取消注释以下行: 启用S​​SL连接并使用此URL: 则程序失败,并且错误与证书有关。 那么,我该怎么解决这个问题呢? 问题答案: 引起原因:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderExcept