Java MySQL JDBC over SSL问题
如何使MySQL JDBC在SSL上工作(使用X509证书验证) 我已经获得了MySQL手册中所述的自我创建的证书,即使用SSL进行安全连接的Java MySQL JDBC over SSL问题,java,mysql,ssl,jdbc,Java,Mysql,Ssl,Jdbc,如何使MySQL JDBC在SSL上工作(使用X509证书验证) 我已经获得了MySQL手册中所述的自我创建的证书,即使用SSL进行安全连接的,具体如下: # Create CA certificate shell> openssl genrsa 2048 > ca-key.pem shell> openssl req -new -x509 -nodes -days 1000 \ -key ca-key.pem > ca-cert.pem # Crea
,具体如下:
# Create CA certificate
shell> openssl genrsa 2048 > ca-key.pem
shell> openssl req -new -x509 -nodes -days 1000 \
-key ca-key.pem > ca-cert.pem
# Create server certificate
shell> openssl req -newkey rsa:2048 -days 1000 \
-nodes -keyout server-key.pem > server-req.pem
shell> openssl x509 -req -in server-req.pem -days 1000 \
-CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
# Create client certificate
shell> openssl req -newkey rsa:2048 -days 1000 \
-nodes -keyout client-key.pem > client-req.pem
shell> openssl x509 -req -in client-req.pem -days 1000 \
-CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
发出后,将所有ON**授予vic@localhost由“12345”标识,需要X509代码>我可以通过命令行连接到MySQL:
mysql -u vic -p --ssl-ca=ca-cert.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem mysql
...
mysql> SHOW STATUS LIKE 'Ssl_cipher';
+---------------+--------------------+
| Variable_name | Value |
+---------------+--------------------+
| Ssl_cipher | DHE-RSA-AES256-SHA |
+---------------+--------------------+
然而,当我尝试运行Java测试时,我得到了身份验证失败:用户'vic'@'localhost'的访问被拒绝(使用密码:YES)
。代码如下:
public class Launcher {
public static void main(String[] args) throws DbException, SQLException, ClassNotFoundException {
StringBuffer sb = new StringBuffer("jdbc:mysql://localhost/bt?useSSL=true&");
sb.append("user=vic&password=12345&");
sb.append("clientCertificateKeyStorePassword=123456&");
sb.append("clientCertificateKeyStoreType=JKS&");
sb.append("clientCertificateKeyStoreUrl=file:///home/vic/tmp/client-keystore&");
sb.append("trustCertificateKeyStorePassword=123456&");
sb.append("trustCertificateKeyStoreType=JKS&");
sb.append("trustCertificateKeyStoreUrl=file:///home/vic/tmp/ca-keystore");
Class.forName("com.mysql.jdbc.Driver");
Connection c = DriverManager.getConnection(sb.toString());
Statement st = c.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM test_table");
while (rs.next()) {
System.out.println(rs.getInt("id"));
}
rs.close(); st.close(); c.close();
}
}
下面是我如何准备Java密钥库文件的:
keytool -import -alias mysqlServerCACert -file ca-cert.pem -keystore ca-keystore
keytool -import -file client-cert.pem -keystore client-keystore -alias client-key
更新如果我使用“root”用户而不是“vic”,我可以通过JDBC通过SSL进行连接。然后是下面的代码
Statement st = c.createStatement();
ResultSet rs = st.executeQuery("SHOW STATUS LIKE 'Ssl_cipher';");
while (rs.next()) {
System.out.println(rs.getString(1));
System.out.println(rs.getString(2));
}
印刷品
Ssl_cipher
DHE-RSA-AES128-SHA
但我不能在生产中使用root,我想知道为什么JDBC使用AES128,而命令行mysql客户端使用AES256
UPDATE2在我将ssl\u类型更改为X509
后,在user
表中为root@localhost
,请求对客户端进行完全身份验证,我得到的root和vic的行为相同——无法通过JDBC登录
UPDATE3如果我在GRANT
语句中使用requiressl
而不是requirex509
,则代码有效。可以让X509正常工作吗?我已经决定使用要求SSL
。如果有人知道如何使X509与JDBC一起工作,我们将不胜感激。当用户配置为仅需要SSL时,我甚至可以在不指定客户端证书属性的情况下进行连接。对自签名证书的支持最近添加到MariaDB JDBC驱动程序中最新版本(撰写本文时为1.1.3)还允许您在运行时直接指定服务器证书,这样您就不需要预先配置密钥存储或导入证书
要设置的两个属性是usesssl
和serverSslCert
。后者可以是证书本身(字符串值)或包含证书的文件路径(完整路径或相对类路径):
有关如何连接的完整工作示例,请参见此处:似乎MariaDB驱动程序人员有一个测试类,可以遍历所有场景,包括“需要X509”
有关如何在MySQL/MariaDB JDBC连接中使用自签名X.509证书,请参见我的答案。
String url = "jdbc:mysql://" + host + ":" + port + "/" + database;
Properties info = new Properties();
info.setProperty("user", username);
info.setProperty("password", password);
info.setProperty("useSSL", "true");
info.setProperty("serverSslCert", "classpath:server.crt");
Connection conn = DriverManager.getConnection(url, info);