使用来自计算引擎和/或外部网络的SSL的Google Cloud SQL

我正在尝试使用SSL连接到Google Cloud SQL(mysql)实例。 我已经启用了两个IP地址和一个具有远程访问权限的用户来自这些IP地址。 我还从Google的开发者控制台生成了证书文件。

client-key.pem client-cert.pem server-ca.pem 

从两个启用的IP地址中的每一个使用此命令,我成功建立了连接。

 mysql --ssl-ca=server-ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem --host=xxx.xxx.xxx.xxx --user=username --password 

由于mysql客户端正常工作,我知道我的防火墙设置,用户,证书等都已正确设置。

现在我想在可执行jar文件中与java建立类似的连接。

按照此处列出的步骤操作: http : //dev.mysql.com/doc/connector-j/en/connector-j-reference-using-ssl.html

 Step 1: keytool -import -alias mysqlServerCACert -file cacert.pem -keystore truststore 

注意:我将server-ca.pem替换为说明中使用的cacert.pem

 Step 2: openssl x509 -outform DER -in client-cert.pem -out client.cert Step 3: keytool -import -file client.cert -keystore keystore -alias mysqlClientCertificate 

这些步骤创建了我的密钥库和信任库文件。 我在生成这两个文件时为每个文件关联不同的密码。

这是相关的Java代码:

 public void testConnection() throws ClassNotFoundException, SQLException, IllegalAccessException, InstantiationException { String path = "/home/user/dir/"; // path to keystore and truststore file System.setProperty("javax.net.ssl.keyStore",path + "keystore"); System.setProperty("javax.net.ssl.keyStorePassword",keyStorePassword); System.setProperty("javax.net.ssl.trustStore",path + "truststore"); System.setProperty("javax.net.ssl.trustStorePassword",trustStorePassword); String user = "dbuser"; String password = "dbUserPassword"; Connection conn = null; int i = 0; try { String url = "jdbc:mysql://:3306/" + "?verifyServerCertificate=true" + "&useSSL=true" + "&requireSSL=true"; Class dbDriver = Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(url, user, password); ResultSet rs = conn.createStatement().executeQuery( "SELECT 1 + 1 as val"); while (rs.next()) { i = rs.getInt(1); } } catch (Exception ex) { ex.printStackTrace(); } finally { if (conn != null) { try { conn.close(); } catch (Exception e) { e.printStackTrace(); } } } System.out.println("The MySQL value is: " + i); } 

同样,从两个启用的IP地址,我能够使用在java代码中使用的相同用户和密码连接MySQL命令行客户端。

我用java收到以下连接exception。 鉴于mysql客户端使用相同的用户/ passwd凭证,我有点怀疑错误消息。 任何见解都非常赞赏。 有没有其他人获得SSL并使用Google SQL? 提出的想法,建议,技巧和提示。 谢谢!

 java.sql.SQLException: Access denied for user 'dbuser'@'xxx.xxx.xxx.xxx' (using password: YES) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:946) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:885) at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3421) at com.mysql.jdbc.MysqlIO.negotiateSSLConnection(MysqlIO.java:3988) at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1293) at com.mysql.jdbc.Connection.createNewIO(Connection.java:2775) at com.mysql.jdbc.Connection.(Connection.java:1555) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285) at java.sql.DriverManager.getConnection(DriverManager.java:571) at java.sql.DriverManager.getConnection(DriverManager.java:215) at com.test.UserData.getConnection(UserData.java:81) at com.test.UserData.testConnection(UserData.java:52) 

mba12我有同样的问题,谢谢你的回答!

所以,解决方案就在这里(正如您所指出的): 如何使用JDBC与X509连接到MySQL?

我还发现了这一点: 在Java密钥库中导入现有的x509证书和私钥以在ssl中使用

只是为了澄清

javax.net.ssl.keyStore必须是客户端证书+密钥组合,而不仅仅是MySQL指南中描述的客户端证书。

总结一下

  1. 我们有:

server-ca.pem – MySQL CA证书,可以从“SSL配置 – >查看服务器CA证书”下载

client-cert.pem – 客户端公钥,可以从“客户端证书 – >新创建的证书”下载

client-key.pem – 客户端私钥,只能从“新建SSL证书创建对话框”下载

这里描述: https : //cloud.google.com/sql/docs/configure-ssl-instance

让我们将它们保存在server-instance /文件夹中,并在步骤2中为生成的文件创建jks /文件夹。

  1. 创建truststore文件

    2.1。 将原始JAVA的cacerts复制到jks/truststore.jks

    cp $JAVA_HOME/jre/lib/security/cacerts jks/truststore.jks

    2.2。 将MySQL服务器CA证书/ Google Cloud SQL Server CA server-ca.pem到我们在步骤2.1中复制的JAVA的默认信任库cacerts

    keytool -importcert -noprompt -trustcacerts -keystore jks/truststore.jks -storepass changeit -alias googlecloudsqlservercacert -file server-instance/server-ca.pem

  2. 创建keystore文件

    3.1。 将x509证书和私钥转换为pkcs12文件:

    openssl pkcs12 -export -in server-instance/client-cert.pem -inkey server-instance/client-key.pem -out jks/client.p12

    (输入强制密码),例如: p4ssw0rd

    3.2。 将pkcs12文件转换为java密钥库:

    keytool -importkeystore -srckeystore jks/client.p12 -srcstoretype PKCS12 -destkeystore jks/keystore.jks -deststoretype JKS

    (输入相同的密码),例如: p4ssw0rd

关于转换: http : //blog.ejbca.org/2008/02/converting-keystores-between-jks-and.html