【问题标题】:Default Mysql SSL connection faling after overriding default kaystore to custom keystore将默认 kaystore 覆盖到自定义密钥库后,默认 Mysql SSL 连接失败
【发布时间】:2021-10-13 22:41:01
【问题描述】:

我有 Mysql 8.0.19 作为 docker 实例。 在我们之前的应用程序中,我们使用 JDK 的 SSL 默认密钥库。 使用 JDK 与 Mysql 服务器的密钥库连接在 SSL 和没有 SSL 的情况下都很好。 这里我们没有手动为 Mysql 配置 SSL。我们使用的是 Mysql 的默认 SSL 机制。

现在出于某种原因,我们决定使用我们自己的密钥库,并使用以下变量覆盖 JVM 的密钥库

-Djavax.net.ssl.keyStore=$keystorePath$
-Djavax.net.ssl.keyStorePassword=$sslKeyStorePwd$
-Djavax.net.ssl.trustStore=$keystorePath$"
-Djavax.net.ssl.trustStorePassword=$sslKeyStorePwd$

在此之后,SSL 与 mysql 的连接失败并出现以下错误

javax.net.ssl|ERROR|01|main|2021-08-10 16:20:30.019 IST|TransportContext.java:313|Fatal (UNKNOWN_CA): Received fatal alert: unknown_ca (
"throwable" : {
  javax.net.ssl.SSLHandshakeException: Received fatal alert: unknown_ca
    at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:128)
    at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:308)
    at java.base/sun.security.ssl.Alert$AlertConsumer.consume(Alert.java:279)
    
Exception in thread "main" com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)

在 /var/lib/mysql/ 我们有 ca.pem,ca-key.pem,client-cert.pem,client-key.pem, public_key.pem,private_key.pem,server-cert.pem, server-key.pem。

为了解决这个错误,我尝试将 ca.pem、client-cert.pem、server-cert.pem 导入我们的密钥库,但没有成功。

【问题讨论】:

    标签: java mysql ssl openssl ssl-certificate


    【解决方案1】:

    unknown_ca 表示证书未由受信任的证书颁发机构签名。我的猜测是您的密钥库中没有整个链

    【讨论】:

    • 那么这里正是需要导入哪些证书。所以即使我导入来自mysql本身的ca.pem,client-cert.pem,server-cert.pem ..它给出了同样的错误。
    • 你需要检查你的证书(连接时使用的那个)。它通常由 CA 签名(通常由中间 CA)。您需要在密钥库中添加中间体,在信任库中添加父 CA。由于它适用于默认密钥库,我猜你有它们在那里。
    • 我已经尝试过导入来自mysql安装本身的ca.pem、client-cert.pem、server-cert.pem,但它没有帮助。
    • 你说的证书是由一个CA(或链中的多个)签名的,你需要导入整个链。
    • 我们只有安装mysql的那些证书。看来我们那里没有完整的链条。当我查看以前工作正常的 jdk-11.0.3\lib\security\cacerts 文件时,有很多条目,Mysql 使用的条目并不清楚。所以无法理解需要导入哪些证书。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多