当 Connector/J 连接属性 sslMode
设置为 VERIFY_CA
或 VERIFY_IDENTITY
时,将启用通过服务器证书验证的服务器身份验证。如果未设置 sslMode
,则当旧属性 useSSL
和 verifyServerCertificate
均为 true 时,将启用通过服务器证书验证的服务器身份验证。
由受信任的 CA 签名的证书。 当启用通过服务器证书验证的服务器身份验证时,如果没有对服务器身份验证进行其他配置,Java 将使用其默认受信任的 CA 证书(通常来自 $JAVA_HOME/lib/security/cacerts
)来验证服务器证书。
使用自签名证书。 不过,MySQL 服务器证书通常是自签名的,或者由自签名的 CA 证书签名;MySQL 服务器创建的自动生成的证书和密钥基于后者,也就是说,服务器会生成所有必需的密钥和一个自签名的 CA 证书,该证书用于对服务器证书和客户端证书进行签名。然后,服务器将自身配置为使用 CA 证书和服务器证书。尽管客户端证书文件位于同一目录中,但服务器不会使用它。
为了验证服务器证书,Connector/J 需要能够读取对其进行签名的证书,即对其自身进行签名的服务器证书或自签名的 CA 证书。这可以通过将证书(ca.pem
或任何其他证书)导入 Java 默认信任库(尽管不建议篡改默认信任库)或将其导入自定义 Java 信任库文件并相应地配置 Connector/J 驱动程序来实现。使用 Java 的 keytool(通常位于 JDK 或 JRE 安装的 bin
子目录中)来导入服务器证书。
$> keytool -importcert -alias MySQLCACert -file ca.pem \
-keystore truststore -storepass mypassword
为命令选项提供适当的参数。如果信任库文件尚不存在,则将创建一个新文件;否则,证书将被添加到现有文件中。与 keytool 的交互如下所示:
Owner: CN=MySQL_Server_8.4.0_Auto_Generated_CA_Certificate
Issuer: CN=MySQL_Server_8.4.0_Auto_Generated_CA_Certificate
Serial number: 1
Valid from: Thu Mar 07 11:37:33 WET 2024 until: Sun Mar 05 11:37:33 WET 2034
Certificate fingerprints:
SHA1: 43:12:0F:96:1A:09:1C:D2:5B:62:7A:2A:55:6C:62:6A:84:5F:78:E4
SHA256: 7D:86:18:FF:06:A7:DF:A7:7C:D0:07:AB:96:1A:51:FD:02:4F:32:BF:1C:51:35:42:27:81:53:0A:8F:D3:56:39
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3
Extensions:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
Trust this certificate? [no]: yes
Certificate was added to keystore
该命令的输出显示了有关导入证书的所有详细信息。请确保记住您提供的密码。另外,请注意,密码必须在 Connector/J 配置文件或应用程序源代码中以纯文本形式写入。
下一步是配置 Java 或 Connector/J 以读取您刚刚创建或修改的信任库。这可以使用以下三种方法之一来完成:
-
使用 Java 命令行参数
-Djavax.net.ssl.trustStore=path_to_truststore_file -Djavax.net.ssl.trustStorePassword=mypassword
-
直接在客户端代码中设置系统属性
System.setProperty("javax.net.ssl.trustStore","path_to_truststore_file"); System.setProperty("javax.net.ssl.trustStorePassword","mypassword");
-
设置 Connector/J 连接属性
trustCertificateKeyStoreUrl=file:path_to_truststore_file trustCertificateKeyStorePassword=mypassword
请注意,当一起使用时,连接属性会覆盖由其他两种方法设置的值。此外,使用连接属性设置的任何值仅在该连接中使用,而使用系统范围值设置的值将用于所有连接(除非被连接属性覆盖)。将连接属性 fallbackToSystemTrustStore
设置为 false
可以防止 Connector/J 在未使用方法 (3) 时回退到使用方法 (1) 或 (2) 创建的系统范围信任库设置。
通过上述设置并启用服务器身份验证,所有建立的连接都将进行 SSL 加密,并在 SSL 握手过程中对服务器进行身份验证,客户端现在可以安全地信任它所连接的服务器。
对于 X-Protocol 连接,连接属性 xdevapi.ssl-truststore
、xdevapi.ssl-truststore-type
、xdevapi.ssl-truststore-password
和 xdevapi.ssl-fallbackToSystemTrustStore
指定信任库设置,就像 trustCertificateKeyStoreUrl
、trustCertificateKeyStoreType
、trustCertificateKeyStorePassword
和 fallbackToSystemTrustStore
对 MySQL 协议连接所做的那样;如果未明确设置,xdevapi.ssl-truststore
、xdevapi.ssl-truststore-type
、xdevapi.ssl-truststore-password
和 xdevapi.ssl-fallbackToSystemTrustStore
将分别采用 trustCertificateKeyStoreUrl
、trustCertificateKeyStoreType
、trustCertificateKeyStorePassword
和 fallbackToSystemTrustStore
的值。
服务标识验证。 除了通过服务器证书验证进行服务器身份验证之外,当 sslMode
设置为 VERIFY_IDENTITY
时,Connector/J 还会通过检查其用于连接的主机名是否与服务器证书中的通用名称值匹配来执行主机名标识验证。