首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用mySQL RDS客户端身份验证

问禁用mySQL RDS客户端身份验证
EN

Stack Overflow用户
提问于 2019-02-25 15:35:33
回答 1查看 1.2K关注 0票数 1

我正在尝试从java mySQL应用程序连接到SpringBoot RDS。我已经对DB做了必要的更改。

代码语言:javascript
复制
ALTER USER 'my_app'@'%' require SSL;
GRANT USAGE ON *.* TO 'my_app'@'%' REQUIRE SSL;

但是,连接不会发生。它在客户端身份验证部分失败。服务器(mysql db)无法对客户机(java应用程序)进行身份验证。

问题:

更多信息:

我还将AWS根和区域证书导入到我的信任存储中。此时(如果没有一个作为keyStore传递的),连接就会正常进行。

但是,在我的应用程序中,我也需要使用keyStore。

代码语言:javascript
复制
 -Djavax.net.ssl.keyStore=path/keyStore.jks
 -Djavax.net.ssl.keyStorePassword=<keyStore_password>

当我这样做时,连接不会发生,并引发以下错误:

代码语言:javascript
复制
main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: unknown_ca
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

添加ssl握手调试,我看到以下日志:

代码语言:javascript
复制
*** CertificateRequest
Cert Types: RSA, DSS, ECDSA
Cert Authorities:
<Empty>
localhost-startStop-1, READ: TLSv1.1 Handshake, length = 4
*** ServerHelloDone
matching alias: mysqlrds
matching alias: client-nonprod
*** Certificate chain
chain [0] = [

在服务器(mysql )试图验证客户端(java应用程序)的部分,它似乎失败了。在下面的步骤中,客户机(java应用程序)需要向服务器(mysql db)提供一个证书。

在上面的步骤(CertificateRequest)中,服务器正在发送一个空的“证书颁发机构”。这通常意味着服务器(mysql db)有一个空的或没有初始化的信任存储。之后的步骤(证书链),客户端(java应用程序)向服务器(mysql db)发送证书。在这种情况下,"keyStore_cert.jks“。但是服务器,不知道它和它抛出和错误的握手。

示例代码:

代码语言:javascript
复制
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

//1. Dowload my sql connector to a folder "jars". http://central.maven.org/maven2/mysql/mysql-connector-java/8.0.13/mysql-connector-java-8.0.13.jar
//   This file and the jars folder are on the same folder (or level). Not inside one another.
//2. edit this file to have your settings. Name of the DB,URL,username,password,trustStore,keyStore,DB name, table name.
//3. compile the file:  javac -cp ".:./jars/mysql-connector-java-8.0.13.jar"  SampleCode.java
//4. run the program:   java -cp ".:./jars/mysql-connector-java-8.0.13.jar"  SampleCode

public class SampleCode {
  public static void main(String[] args) {
    Connection con;
    try {
      // TODO: replace with your settings.
      System.setProperty("javax.net.ssl.trustStore", "path/resource/certs/trustStore.jks");
      System.setProperty("javax.net.ssl.trustStorePassword", "trustStore_pass");
      System.setProperty("javax.net.ssl.keyStore", "path/resource/certs/keyStore.jks");
      System.setProperty("javax.net.ssl.keyStorePassword", "keyStore_pass");
      System.setProperty("javax.net.debug", "ssl:handshake");

      Class.forName("com.mysql.cj.jdbc.Driver");
      // TODO: replace with your settings.
      con = DriverManager.getConnection(
          "jdbc:mysql://my_db_name.random_string.us-east-1.rds.amazonaws.com:3/my_db?useLegacyDatetimeCode=false&verifyServerCertificate=true&useSSL=true&requireSSL=true",
          "my_app", "my_pass");

      System.out.println(" connection successful \n");
      Statement stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery("SELECT * FROM my_table "); // TODO: replace with yours.
      while (rs.next()) {
        System.out.println("id : " + rs.getString("id"));
      }

      rs.close();
      stmt.close();
      con.close();
    } catch (Exception e) {
      System.out.println(e);
    }
  }
}

标准物质:

EN

回答 1

Stack Overflow用户

发布于 2021-05-06 13:31:37

在使用hibernate的应用程序中,我遇到了同样的错误。显然,RDS只在SSL握手期间进行客户端身份验证。不必因为需要为应用程序使用单独的密钥存储而禁用客户端身份验证,而是可以通过连接属性覆盖用于jdbc连接的密钥存储。

  1. 按照https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/ssl-certificate-rotation-mysql.html中“更新应用程序信任存储的JDBC”一节中提到的步骤,获取将用于RDS连接的客户端密钥存储库。
  2. 在示例代码中添加以下代码:
代码语言:javascript
复制
Properties properties = new Properties();
properties.put("user", "my_app");
properties.put("password", "my_pass");  properties.put("clientCertificateKeyStoreUrl","file:path_to_rds_truststore_file");
properties.put("clientCertificateKeyStorePassword","password");
 String url = "jdbc:mysql://localhost/mydatabase";
Connection con = DriverManager.getConnection(url, properties); 

通过以上操作,您可以重写将用于在使用单独的系统范围密钥存储库的同时建立到RDS连接的密钥存储库。注意,每次要连接到RDS实例时,都需要设置这些属性。

正如你的推荐信中提到的

注意,当一起使用时,连接属性将覆盖其他两个方法设置的值。此外,任何具有连接属性的值都只在该连接中使用,而使用系统范围的值设置的值则用于所有连接(除非被连接属性覆盖)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54869688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档