Java 为什么JDBC可以在配置了SSL的情况下连接到MySQL,而没有证书

Java 为什么JDBC可以在配置了SSL的情况下连接到MySQL,而没有证书,java,mysql,ssl,jdbc,Java,Mysql,Ssl,Jdbc,所以我的问题是,我似乎已经从命令行保护了MySQL,但当我通过JDBC连接时,同样的限制消失了。顺便说一句,我不喜欢使用SSL进行数据库连接,这是我第一次尝试设置它 我在linux机器上本地设置了MySQL的SSL。我生成证书,编辑my.cnf,整个九码 以下是我在my.cnf中添加的内容: [mysqld] ssl-ca=/var/lib/mysql/cert/ca-cert.pem ssl-cert=/var/lib/mysql/cert/server-cert.pem ssl-key=/v

所以我的问题是,我似乎已经从命令行保护了MySQL,但当我通过JDBC连接时,同样的限制消失了。顺便说一句,我不喜欢使用SSL进行数据库连接,这是我第一次尝试设置它

我在linux机器上本地设置了MySQL的SSL。我生成证书,编辑my.cnf,整个九码

以下是我在my.cnf中添加的内容:

[mysqld]
ssl-ca=/var/lib/mysql/cert/ca-cert.pem
ssl-cert=/var/lib/mysql/cert/server-cert.pem
ssl-key=/var/lib/mysql/cert/server-key.pem
这里有我的服务器证书/密钥和CA证书的有效路径。顺便说一句,它是自签名的。我需要时会有一个更正式的路径

在MySQL数据库中,我将数据库用户帐户设置为需要SSL:

GRANT ALL PRIVILEGES ON *.* TO ‘orgapi’@’localhost’ IDENTIFIED BY ‘password’ REQUIRE SSL;
到目前为止还不错。一旦用户需要SSL,MySQL似乎需要在建立连接时提供客户端证书。我也生成了该证书,并使用相同的自签名CA证书对其进行签名

现在,对于第一个测试:我尝试在没有客户端证书的情况下从命令行登录:

mysql -u orgapi -p -h localhost
维奥拉,它不能让我登录。但是,当我在login命令中包含SSL证书时,如下所示:

mysql--sslca=ca-cert.pem--sslcert=client-cert.pem--ssl key=client-key.pem-u orgapi-p-h localhost

它就像一个符咒。我可以在指定客户端证书时进行连接,如果我执行“status”命令,它会显示我已使用SSL进行连接

问题:

为了确保一切就绪,我使用JDBC编写了一些基本的测试代码。目前,我没有向这个JDBC代码提供客户端证书。因此,我预计连接会失败

public static void main(String[] args) throws Exception{
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306", "orgapi", "orgapi");
        conn.setCatalog("org_app");
        Statement stmt = conn.createStatement();
        ResultSet resultSet = stmt.executeQuery("select * from users");
        while(resultSet.next()){
            System.out.println(resultSet.getString(1) + " " + resultSet.getString(2));
        }
    }
让我担心的是它没有失败。事实上,它执行查询时没有任何问题。现在,如果我附加到数据库url“”的末尾,那么它将无法连接,因为它没有证书。但我仍然担心JDBC代码将能够连接到MySQL并绕过其他地方存在的限制

所以我只是想知道我可能做错了什么,或者我对这个过程有什么不理解。我只是想确保我的数据库不会因为某种原因而变得不安全

谢谢

编辑:

在使用JDBC时,我确实收到了这个有趣的日志消息:

Sun Oct 23 08:58:28 EDT 2016警告:在没有 不建议使用服务器的身份验证。根据MySQL 如果未设置显式选项,则默认情况下必须建立5.5.45+、5.6.26+和5.7.6+要求SSL连接。遵守 对于不使用SSL的现有应用程序,verifyServerCertificate 属性设置为“false”。您需要显式禁用SSL 通过设置useSSL=false,或设置useSSL=true并为 服务器证书验证


在没有SSL的JDBC连接中,运行查询
SHOW GRANTS。将响应与将cli与SSL一起使用时针对同一查询得到的结果进行比较。@Michael sqlbot它们似乎是相同的。两者都没有提到任何关于SSL的内容,它们只是说“将.上的所有权限授予'orgapi'@'localhost'”。我在上面的帖子中添加了一个我从JDBC看到的日志条目,如果这有帮助的话。您是否考虑过将
verifyServerCertificate
设置为true?我担心您是以不同于预期的用户身份进行连接的,听起来情况并非如此<代码>显示状态,如“Ssl_密码”。如果您得到一个值,那么您确实有一个SSL连接,只是无法保证(根据警告)服务器是真实的。加密SSL连接在技术上不需要客户端证书/密钥/CA文件,但需要客户端证书/密钥/CA文件对对等方进行身份验证。MySQL通过要求使用CLI来解决问题,这是出于好意。它们不是技术需要所必需的,所以您可能毕竟是JDBC中的SSL。