我正在尝试使用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客户端使用的是同一个用户/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.<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)

最佳答案

我也有同样的问题,谢谢你的回答!
所以,解决办法就在这里(正如你指出的那样):
How to connect to MySQL with X509 using JDBC?
我还发现了这个:
importing an existing x509 certificate and private key in Java keystore to use in ssl
只是为了澄清
javax.net.ssl.keyStore必须是客户端证书+密钥组合,而不仅仅是MySQL指南中描述的客户端证书。
总结
我们有:
server-ca.pem-MySQL CA证书,可从“SSL配置->查看服务器CA证书”下载
client-cert.pem-客户端公钥,可从“客户端证书->新建证书”下载
client-key.pem-客户端私钥,只能从“新建SSL证书创建对话框”下载
描述如下:https://cloud.google.com/sql/docs/configure-ssl-instance
让我们将它们保存在服务器实例/文件夹中,并在步骤2中为生成的文件创建jks/文件夹。
创建truststore文件
2.1条。将原始JAVA的cacerts复制到jks/truststore.jks
cp $JAVA_HOME/jre/lib/security/cacerts jks/truststore.jks
2.2条。将MySQL Server CA Certificate/Google Cloud SQL Server CAserver-ca.pem添加到我们在步骤2.1中复制的JAVA默认信任库中
cacerts
创建keytool -importcert -noprompt -trustcacerts -keystore jks/truststore.jks -storepass changeit -alias googlecloudsqlservercacert -file server-instance/server-ca.pem文件
3.1条。将x509证书和私钥转换为pkcs12文件:
keystore
(输入强制密码),例如:openssl pkcs12 -export -in server-instance/client-cert.pem -inkey server-instance/client-key.pem -out jks/client.p12
3.2条。将pkcs12文件转换为java密钥库:
p4ssw0rd
(输入相同的密码),例如:keytool -importkeystore -srckeystore jks/client.p12 -srcstoretype PKCS12 -destkeystore jks/keystore.jks -deststoretype JKS
关于转换:
http://blog.ejbca.org/2008/02/converting-keystores-between-jks-and.html

关于java - 来自Compute Engine和/或外部网络的带有SSL的Google Cloud SQL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31055623/

10-10 02:57
查看更多