服务器可能希望对客户端进行身份验证,并要求客户端向其提供 SSL 证书,然后根据其已知的证书颁发机构验证该证书,或根据需要对客户端身份进行其他检查(有关详细信息,请参阅 CREATE USER SSL/TLS 选项)。在这种情况下,Connector/J 需要访问客户端证书,以便在建立新的数据库连接时将其发送到服务器。这是使用 Java 密钥库文件完成的。
要允许客户端身份验证,连接到服务器的客户端必须拥有自己的密钥集和 SSL 证书。客户端证书必须经过签名,以便服务器可以验证它。虽然您可以让官方证书颁发机构签署客户端证书,但更常见的是使用中间的私有 CA 证书来签署客户端证书。此类中间 CA 证书可以是自签名的,也可以由受信任的根 CA 签署。要求是服务器知道能够验证客户端证书的 CA 证书。
一些 MySQL 服务器版本能够生成用于通信加密的 SSL 密钥和证书,包括证书和私钥(包含在 client-cert.pem
和 client-key.pem
文件中),任何客户端都可以使用它们。此 SSL 证书已由自签名 CA 证书 ca.pem
签署,服务器可能已配置为使用该证书。
如果您不想使用服务器生成的客户端密钥和证书文件,也可以使用 创建 SSL 和 RSA 证书和密钥 中描述的过程生成新的密钥和证书。请注意,根据服务器的设置,您可能需要重复使用服务器已配置为使用的现有 CA 证书来签署新客户端证书,而不是创建新的 CA 证书。
获得要使用的客户端私钥和证书文件后,需要将它们导入 Java 密钥库,以便 Java SSL 库和 Connector/J 可以使用它们。以下说明解释了如何创建密钥库文件
-
将客户端密钥和证书文件转换为 PKCS #12 档案
$> openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem \ -name "mysqlclient" -passout pass:mypassword -out client-keystore.p12
-
将客户端密钥和证书导入 Java 密钥库
$> keytool -importkeystore -srckeystore client-keystore.p12 -srcstoretype pkcs12 \ -srcstorepass mypassword -destkeystore keystore -deststoretype JKS -deststorepass mypassword
为命令选项提供正确的参数。如果密钥库文件尚不存在,将创建一个新的文件;否则,证书将被添加到现有文件中。由 keytool 输出的示例如下
Entry for alias mysqlclient successfully imported. Import command completed: 1 entries successfully imported, 0 entries failed or cancelled
确保记住您选择的密码。另外,请注意,密码将必须以纯文本形式写入 Connector/J 配置文件或应用程序源代码中。
执行此步骤后,可以删除 PKCS #12 档案(示例中的
)。client-keystore.p12
下一步是配置 Java 或 Connector/J 以便它读取您刚刚创建或修改的密钥库。这可以通过以下三种方法之一来完成
-
使用 Java 命令行参数
-Djavax.net.ssl.keyStore=path_to_keystore_file -Djavax.net.ssl.keyStorePassword=mypassword
-
在客户端代码中直接设置系统属性
System.setProperty("javax.net.ssl.keyStore","path_to_keystore_file"); System.setProperty("javax.net.ssl.keyStorePassword","mypassword");
-
通过 Connector/J 连接属性
clientCertificateKeyStoreUrl=file:path_to_truststore_file clientCertificateKeyStorePassword=mypassword
请注意,当一起使用时,连接属性会覆盖由其他两种方法设置的值。此外,使用连接属性设置的任何值仅在该连接中使用,而使用系统范围的值设置的值将用于所有连接(除非被连接属性覆盖)。将连接属性 fallbackToSystemKeyStore
设置为 false
将阻止 Connector/J 在未使用方法 (3) 时回退到使用方法 (1) 或 (2) 创建的系统范围的密钥库设置。
通过上述设置,建立的所有连接都将使用 SSL 加密,客户端将在 SSL 握手过程中进行身份验证,并且服务器现在可以安全地信任向其请求连接的客户端。
对于 X 协议连接,连接属性 xdevapi.ssl-keystore
、xdevapi.ssl-keystore-type
、xdevapi.ssl-keystore-password
和 xdevapi.ssl-fallbackToSystemKeyStore
指定密钥库设置,就像 trustCertificateKeyStoreUrl
、trustCertificateKeyStoreType
、trustCertificateKeyStorePassword
和 fallbackToSystemTKeyStore
对 MySQL 协议连接所做的那样;如果未明确设置,xdevapi.ssl-keystore
、xdevapi.ssl-keystore-type
、xdevapi.ssl-keystore-password
和 xdevapi.ssl-fallbackToSystemKeyStore
将分别采用 clientCertificateKeyStoreUrl
、clientCertificateKeyStoreType
、clientCertificateKeyStorePassword
和 fallbackToSystemKeyStore
的值。