gpt4 book ai didi

java - 来自 Compute Engine 和/或外部网络的带有 SSL 的 Google Cloud SQL

转载 作者:行者123 更新时间:2023-11-29 04:40:10 26 4
gpt4 key购买 nike

我正在尝试连接到 Google Cloud SQL(使用 SSL 的 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

这些步骤创建了我的 keystore 和信任库文件。在生成这两个文件时,我为它们分别关联了不同的密码。

这里是相关的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)

最佳答案

mba12 我也遇到了同样的问题,谢谢解答!

因此,解决方案就在这里(正如您所指出的): 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 必须是客户端证书 + key 组合,而不仅仅是 MySQL 指南中描述的客户端证书。

总结

  1. 我们有:

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

client-cert.pem - 客户端公钥,可以从“Client Certificates -> new created certificate”下载

client-key.pem - 客户端私钥,只能从“New SSL Certificate created dialog box”下载

此处描述:https://cloud.google.com/sql/docs/configure-ssl-instance

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

  1. 创建truststore文件

    2.1。复制原始JAVA的cacertsjks/truststore.jks:

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

    2.2。将 MySQL Server 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 keystore :

    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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com