当使用 Java 8 到 12 JRE 时,如果 JSSE 配置为使用 FIPS 模式,则尝试连接到 MySQL 服务器在某些情况下可能会失败,并出现 KeyManagementException 错误,提示 "FIPS 模式:只能使用 SunJSSE TrustManagers"。 这是因为在这种情况下,Connector/J 实现的自定义 TrustManager 支持不同的 sslMode 选项,但最终会被 SunJSSE 的默认实现拒绝。
可以通过告诉 Connector/J 不要使用其自定义的 TrustManager 实现,而是使用您自己的安全提供程序来解决此问题。 这可以通过设置以下连接属性来完成
-
fipsCompliantJsse: 设置为true来解决 FIPS 模式下提到的问题。注意当设置为 true 时,Connector/J 始终执行服务器证书验证(即使
sslMode设置为PREFERRED或REQUIRED),这意味着必须使用下面描述的连接属性配置一个信任库,或者必须启用回退的系统范围信任库。 KeyManagerFactoryProvider: 提供javax.net.ssl.KeyManagerFactory实现的 Java 安全提供程序的名称。trustManagerFactoryProvider: 提供javax.net.ssl.TrustManagerFactory实现的 Java 安全提供程序的名称。keyStoreProvider: 提供java.security.KeyStore实现的 Java 安全提供程序的名称,支持使用clientCertificateKeyStoreType和trustCertificateKeyStoreType指定的密钥存储类型。