我正在尝试使用以下设置创建到 MYSQL 服务器的 ssl 连接。我注意到当我在 jdbc url 中指定 verifyServerCertificate=false 时,Java 似乎忽略了我通过 System.setProperty 指定的 keystore 和信任库信息。所以我可以注释掉 1) 中指定的代码,并且 ssl 连接仍然会成功创建。当我指定 verifyServerCertificate=true 时,它似乎使用 1) 设置的值。所以我的问题是 JDBC 如何在不使用客户端 keystore 和信任库的情况下在 verifyServerCertificate=false 时创建 ssl 连接?谢谢。
Java代码
1)
System.setProperty("javax.net.ssl.keyStore",(String) keyStorePath);
System.setProperty("javax.net.ssl.keyStorePassword", keyStorePassword);
System.setProperty("javax.net.ssl.trustStore",(String) trustStorePath);
System.setProperty("javax.net.ssl.trustStorePassword",(String) trustStorePassword));
2)
String jdbcURL = "jdbc:mysql://192.11.11.111/database?verifyServerCertificate=false&useSSL=true&requireSSL=true";
3)
Connection con = DriverManager.getConnection(jdbcURL, dbuser, dbpassword);
MySQL服务器
授权声明:
4)
'GRANT ALL PRIVILEGES ON *.* TO 'dbuser'@'%' IDENTIFIED BY PASSWORD \'*2343ASDFWETDFGDSFGSDFGSDSDFWERASF\' REQUIRE SSL WITH GRANT OPTION'
编辑到my.cnf文件
5)
[mysqld]
ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem
附加信息
6) 我正在使用我创建的证书颁发机构。
7) 查询响应
show variables like '%ssl%';
have_openssl YES
have_ssl YES
ssl_ca /etc/mysql/certs/ca.pem
ssl_capath
ssl_cert /etc/mysql/certs/server-cert.pem
ssl_cipher
ssl_crl
ssl_crlpath
ssl_key /etc/mysql/certs/server-key.pem
最佳答案
Java 绝对可以在客户端不验证服务器证书链的情况下建立 SSL 连接。
建立连接的类(javax.net.ssl 类)通常会怀疑未经验证的服务器证书,并且会导致握手失败。
但它们为这些类的用户提供了一种方法,实际上可以说“如果服务器的证书未通过验证也没关系,请继续建立连接”。
这就是当您说 verifyServerCertificate=false 时发生的情况。
从加密的角度来看,SSL 连接是完全有效的,但它不是经过身份验证的连接,因为您不知道服务器证书的来源是什么。
关于java - JDBC 参数 verifyServerCertificate=false 无需客户端 keystore 和信任库即可连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33700647/