请问 mysql 如何对发起通信的 java 客户端做证书验证

请问,我 mysql 生成了 ssl 相关证书和秘钥,也创建了需要 ssl 连接的账户,但是为啥在登录时直接添加【--ssl-mode=require】就可以了,为啥没有验证秘钥和证书的步骤


在 java 程序里也是,添加 useSSL=true 就可以正常连接了,我希望的效果是 mysql 要对发起通信请求的客户端做证书验证

img

【以下回答由 GPT 生成】

回答:

首先,让我们来解释为什么在添加了--ssl-mode=require时可以成功连接MySQL而没有进行证书和秘钥的验证步骤。

当你在MySQL连接字符串中添加了--ssl-mode=require参数时,MySQL会要求客户端使用SSL进行连接。但是,并没有指定要使用哪个SSL证书和秘钥,因此MySQL会默认使用系统的信任证书与客户端进行握手,而不要求进行客户端证书验证。

要实现MySQL对Java客户端的证书验证,需要执行以下步骤:

  1. 将Java客户端的证书导出为PEM格式。你可以使用Java的keytool命令来完成这一步骤。假设你已经有一个Java密钥库文件(.jks或.p12格式),你可以使用以下命令导出证书:
keytool -exportcert -keystore keystore.jks -alias client_alias -file client.pem
  1. 将PEM格式的Java客户端证书存储到MySQL服务器上。你可以将客户端证书存储在MySQL服务器的某个目录下,例如/etc/mysql/ssl

  2. 在MySQL配置文件中启用SSL。编辑MySQL配置文件(通常命名为my.cnfmy.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服务器的证书和秘钥的路径,以及启用了服务器证书验证。

  1. 将Java程序与MySQL服务器建立安全连接。使用以下Java代码示例来建立安全连接:
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();
        }
    }
}

在上述代码中,你需要将usernamepassword替换为你的MySQL用户名和密码,将/path/to/client.pem替换为你导出的Java客户端证书的路径,将keystore_password替换为你客户端密钥库的密码。

通过上述步骤,你就可以实现MySQL对Java客户端的证书验证了。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^