【发布时间】:2015-06-25 16:17:31
【问题描述】:
我正在尝试使用 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://<databaseip>:3306/<databaseName>"
+ "?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 连接异常。鉴于 mysql 客户端使用相同的用户/密码凭据,我有点怀疑错误消息。任何见解都非常感谢。有其他人启动 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.<init>(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)
【问题讨论】:
-
在这里找到第一个解决方案的答案:stackoverflow.com/questions/11509751/…
标签: java mysql google-app-engine ssl