【以下回答由 GPT 生成】
回答:
首先,让我们来解释为什么在添加了--ssl-mode=require
时可以成功连接MySQL而没有进行证书和秘钥的验证步骤。
当你在MySQL连接字符串中添加了--ssl-mode=require
参数时,MySQL会要求客户端使用SSL进行连接。但是,并没有指定要使用哪个SSL证书和秘钥,因此MySQL会默认使用系统的信任证书与客户端进行握手,而不要求进行客户端证书验证。
要实现MySQL对Java客户端的证书验证,需要执行以下步骤:
keytool
命令来完成这一步骤。假设你已经有一个Java密钥库文件(.jks或.p12格式),你可以使用以下命令导出证书:keytool -exportcert -keystore keystore.jks -alias client_alias -file client.pem
将PEM格式的Java客户端证书存储到MySQL服务器上。你可以将客户端证书存储在MySQL服务器的某个目录下,例如/etc/mysql/ssl
。
在MySQL配置文件中启用SSL。编辑MySQL配置文件(通常命名为my.cnf
或my.ini
),将以下内容添加到文件中:
[mysqld]
ssl-ca=/etc/mysql/ssl/ca-cert.pem
ssl-cert=/etc/mysql/ssl/server-cert.pem
ssl-key=/etc/mysql/ssl/server-key.pem
ssl-verify-server-cert = true
上述配置指定了MySQL服务器的证书和秘钥的路径,以及启用了服务器证书验证。
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
public class MySQLConnection {
public static void main(String[] args) {
try {
// 设置MySQL连接属性
Properties prop = new Properties();
prop.setProperty("user", "username");
prop.setProperty("password", "password");
prop.setProperty("useSSL", "true");
prop.setProperty("requireSSL", "true");
prop.setProperty("clientCertificateKeyStoreUrl", "file:/path/to/client.pem");
prop.setProperty("clientCertificateKeyStorePassword", "keystore_password");
// 连接MySQL服务器
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/database", prop);
// 做你的操作...
// 关闭连接
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
在上述代码中,你需要将username
和password
替换为你的MySQL用户名和密码,将/path/to/client.pem
替换为你导出的Java客户端证书的路径,将keystore_password
替换为你客户端密钥库的密码。
通过上述步骤,你就可以实现MySQL对Java客户端的证书验证了。
【相关推荐】