Java 使用公钥为Amazon Aurora DB创建加密连接

Java 使用公钥为Amazon Aurora DB创建加密连接,java,ssl,public-key,amazon-aurora,Java,Ssl,Public Key,Amazon Aurora,我使用Maria JDBC驱动程序创建到Amazon Aurora DB的连接 我想创建一个安全连接,所以我读了 使用MySQL实用程序通过SSL连接到DB群集 从下载Amazon RDS签名证书的公钥 . 请注意,这将下载一个名为rds-combined-ca-bundle.pem的文件 第一个问题:它的安全性如何-任何人都可以从Amazon AWS下载此pem文件 我做了一些研究如何用公钥连接到Aurora DB 我找到了这两个链接 所以我的代码非常简单: Class.forName(&qu

我使用Maria JDBC驱动程序创建到Amazon Aurora DB的连接 我想创建一个安全连接,所以我读了

使用MySQL实用程序通过SSL连接到DB群集

从下载Amazon RDS签名证书的公钥 . 请注意,这将下载一个名为rds-combined-ca-bundle.pem的文件

第一个问题:它的安全性如何-任何人都可以从
Amazon AWS
下载此
pem
文件

我做了一些研究如何用公钥连接到Aurora DB 我找到了这两个链接

所以我的代码非常简单:

Class.forName("org.mariadb.jdbc.Driver");

Properties prop = new Properties();

prop.setProperty("javax.net.ssl.trustStore","C:\\temp\\rds-combined-ca-bundle.pem");
prop.setProperty("user",jdbcDetails.username);
prop.setProperty("password",jdbcDetails.getSensitiveData());

    java.sql.Connection conne = DriverManager.getConnection(jdbcDetails.connectionString, prop);
    try (Statement stmt1 = conne.createStatement()) {
        // Execute all but the rest
        ResultSet rs = stmt1.executeQuery("Select 98765 from dual limit 2");
        while(rs.next()) {

            rs.getLong(1);
        }
    }
    conne.close();
第二个问题:公开密钥文件与加密有何关系

上述信息与上面所说的不符:

如果客户端希望对服务器进行身份验证,则客户端的信任存储必须包含服务器的证书

第三个问题:据我所知,如果客户信任服务器,则不需要他使用此文件

第四个问题:我正在用Wireshark检查连接创建情况 这两个案例都有和没有这个
公钥文件
我能够创建一个连接,而且Wireshark中的两个案例都是加密的

看起来像这样的东西:

Encrypted Application Data:
eb:62:45:fb:10:50:f7:8c............:b9:0a:52:e7:97:1d:34
基于我对公钥使用的了解:

首先,, Amazon AWS Azure文档似乎有点误导——它只与名为MySQL实用工具的特定工具的连接相关

第一、第二和第三个问题的答案:

Class.forName("org.mariadb.jdbc.Driver");

Properties prop = new Properties();

prop.setProperty("javax.net.ssl.trustStore","C:\\temp\\rds-combined-ca-bundle.pem");
prop.setProperty("user",jdbcDetails.username);
prop.setProperty("password",jdbcDetails.getSensitiveData());

    java.sql.Connection conne = DriverManager.getConnection(jdbcDetails.connectionString, prop);
    try (Statement stmt1 = conne.createStatement()) {
        // Execute all but the rest
        ResultSet rs = stmt1.executeQuery("Select 98765 from dual limit 2");
        while(rs.next()) {

            rs.getLong(1);
        }
    }
    conne.close();
“Java完全可以在没有客户端的情况下建立SSL连接 正在验证服务器的证书链。“

密钥交换是为了确保它所连接的服务器确实是它所期望的服务器(即非可疑服务器) 这意味着它仍然是相同的SSL连接,但如果verifyServerCertificate=false,则不会验证它是否是预期的服务器

回答第四个问题: 目前,代码是Java格式的,传递SSL参数可以对其进行加密

因此,使用这些参数可以提供所需的
?trustServerCertificate=true&useSSL=true&requireSSL=true&verifyServerCertificate=false

如果客户端指定了自己的信任库,那么没有理由不验证服务器的证书(使用
verifyServerCertificate=false
客户端将放弃任何安全检查)。顺便说一句,我相信
javax.net.ssl.trustStore
应该是JKS密钥库格式,而不是pem文件