Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法建立到安全mysql开放套接字的Java SSLSocket连接_Java_Mysql_Spring_Ssl - Fatal编程技术网

无法建立到安全mysql开放套接字的Java SSLSocket连接

无法建立到安全mysql开放套接字的Java SSLSocket连接,java,mysql,spring,ssl,Java,Mysql,Spring,Ssl,注:我是一个新手SSLSocket的人 我在一个mysql数据库(版本5.7.9)和一个java应用程序(java 1.8.0_U73)之间有一个安全连接,两者都运行在本地主机上。数据库连接是使用SpringFramework 4.2.4 API创建的。我试图在数据库和Java应用程序通过SpringFramework API进行通信的同一个套接字上打开Java SSLSocket,但没有成功。当我启动ssl套接字startHandshake()方法时,我得到的printstack错误是(请注意

注:我是一个新手SSLSocket的人

我在一个mysql数据库(版本5.7.9)和一个java应用程序(java 1.8.0_U73)之间有一个安全连接,两者都运行在本地主机上。数据库连接是使用SpringFramework 4.2.4 API创建的。我试图在数据库和Java应用程序通过SpringFramework API进行通信的同一个套接字上打开Java SSLSocket,但没有成功。当我启动ssl套接字startHandshake()方法时,我得到的printstack错误是(请注意,替换我正在运行的实际安装文件夹的路径):

mysql数据库使用示例cacert.pem、server-cert.pem和server-key.pem文件启动,这些文件可以在mysql-5.7.11-winx64-debug-test.zip中找到,我使用--ssl ca、--ssl cert和--ssl key启动选项从mysql网站下载

Mysql日志文件显示了mysqld启动的以下内容:

2016-02-24T19:37:06.710628Z 0[注]InnoDB:正在将缓冲池从path加载到\db\mysql\data\ib_buffer_pool
2016-02-24T19:37:06.808638Z 0[警告]指向\db\mysql\data\cacert.pem的CA证书路径是自签名的。
2016-02-24T19:37:06.819639Z 0[注]服务器主机名(绑定地址):“*”;端口:3355
2016-02-24T19:37:06.821639Z 0[注]IPv6可用。
2016-02-24T19:37:06.822639Z 0[注]:::“解析为”:”
2016-02-24T19:37:06.823639Z 0[注意]已在IP上创建服务器套接字:':'.
2016-02-24T19:37:06.977655Z 0[注]InnoDB:缓冲池加载于160224 12:37:06完成
2016-02-24T19:37:07.107668Z 0[注]事件计划程序:加载了0个事件
2016-02-24T19:37:07.108668Z 0[注]指向\db\mysql\bin\mysqld的路径:已准备好连接。
版本:“5.7.9”套接字:“”端口:3355 MySQL社区服务器(GPL)

另外,使用mysql工作台快速连接到mysql数据库显示:

连接:
名称:MyConnection64
主机:本地主机
端口:3355
服务器:MySQL社区服务器(GPL)
版本:5.7.9
登录用户:root
当前用户:root@localhost
SSL:使用DHE-RSA-AES256-SHA

创建Java SpringFramework数据库连接的URL是(从我的SpringFramework dbaccess.xml文件):

entry key=“db.jdbcurl” value=“jdbc:mysql://localhost:3355/imom?useServerPrepStmts=false&rewriteBatchedStatements=true&server.basedir=path 到\db\mysql&server.datadir=path到\db\mysql\data&createDatabaseIfNotExist=true&autoReconnect=true&useSSL=true”

我用来启动java应用程序的VM参数是:
-Djavax.net.ssl.keyStore=“path to\db\mysql\data\keyStore”-Djavax.net.ssl.keystrepassword=“changeme”-Djavax.net.ssl.trustStore=“path to\db\mysql\data\trustStore”-Djavax.net.ssl.trustStorePassword=“changeme”

我正在使用(成功)创建SpringFramework连接的代码是:

private static void testSpring() {

    try {
        Connection conn = DataSourceUtils.getConnection(m_dataSource);
        conn.close();
    } catch (Exception ex) {
        System.out.println(ex.getMessage());
        ex.printStackTrace();
    }
}
我用于创建SSLSocket(未成功)的代码是:


我有点困惑,为什么要用自己的SSL套接字直接连接到MySQL实例。通常,您仍然希望通过任何机制(Spring、JPA等)使用JDBC库,并告诉它使用SSL。正如您不希望使用“普通”套接字直接连接到MySQL服务器一样,您也不希望使用SSL。有关更多信息,请参阅。

@JanetM,但他无论如何都无法做到这一点。创建第二个侦听套接字时,他将获得一个
BindException
。@JanetM在任何情况下,如果只是一个存在性检查,您不需要握手,甚至不需要SSL。谢谢。那也行。我用这个练习来增加我对SSLSockets的理解,因为我有应用程序打开的其他套接字也需要用SSL锁定。我更感兴趣的是SSL握手失败的原因。我使用这个练习来提高我对SSLSockets的理解,因为我有应用程序打开的其他套接字,它们也需要用SSL锁定。
private static void testSpring() {

    try {
        Connection conn = DataSourceUtils.getConnection(m_dataSource);
        conn.close();
    } catch (Exception ex) {
        System.out.println(ex.getMessage());
        ex.printStackTrace();
    }
}
private static void testSocket() {
//      System.setProperty("jsse.enableSNIExtension", "false");
//      System.setProperty("jsse.enabledSSLCipherSuites", "TLS_DHE_RSA_WITH_AES_256_CBC_SHA");

    try {
        Socket socket = new Socket(m_hostnameString, Integer.parseInt(m_portString));
        InputStream keyStoreResource = new FileInputStream(m_baseDir
                + File.separator + "data" + File.separator + "keystore");
        char[] keyStorePassphrase = "changeme".toCharArray();
        KeyStore ksKeys = KeyStore.getInstance("JKS");
        ksKeys.load(keyStoreResource, keyStorePassphrase);

        // KeyManager decides which key material to use.
        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
        kmf.init(ksKeys, keyStorePassphrase);

        InputStream trustStoreIS = new FileInputStream(m_baseDir
                + File.separator + "data" + File.separator + "truststore");
        char[] trustStorePassphrase = "changeme".toCharArray();
        KeyStore ksTrust = KeyStore.getInstance("JKS");
        ksTrust.load(trustStoreIS, trustStorePassphrase);

        // TrustManager decides which certificate authorities to use.
        TrustManagerFactory tmf = TrustManagerFactory
                .getInstance("SunX509");
        tmf.init(ksTrust);

//          SSLSocketFactoryEx factory = new SSLSocketFactoryEx(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

        SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
        SSLSocket sslSocket = (SSLSocket) factory.createSocket(socket, m_hostnameString, Integer.parseInt(m_portString),true);

        // and go!
        sslSocket.startHandshake();
    }
    catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (KeyStoreException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (CertificateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (UnrecoverableKeyException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}