文档首页
MySQL Connector/J 开发人员指南
相关文档 下载此手册
PDF (US Ltr) - 1.2Mb
PDF (A4) - 1.2Mb


MySQL Connector/J 开发人员指南  /  Connector/J 参考  /  使用 SSL 安全连接

6.9 使用 SSL 安全连接

Connector/J 可以使用 SSL 对 JDBC 驱动程序和服务器之间通信的所有数据进行加密(初始握手除外)。启用连接加密会带来性能损失,其严重程度取决于多个因素,包括(但不限于)查询的大小、返回的数据量、服务器硬件、使用的 SSL 库、网络带宽等。

该系统通过两个 Java 密钥库文件工作:一个文件包含服务器的证书信息(在以下示例中为 truststore),另一个文件包含客户端的密钥和证书(在以下示例中为 keystore)。所有 Java 密钥库文件都由您在创建文件时提供给 keytool 的密码保护。您需要文件名和关联的密码才能创建 SSL 连接。

为了使 SSL 支持正常工作,您必须具备以下条件

默认情况下,Connector/J 与 MySQL 服务器建立安全连接。请注意,MySQL 服务器 5.7 及更高版本(在使用 OpenSSL 编译的情况下)可以在启动时自动生成缺失的 SSL 文件,并相应地配置 SSL 连接。

对于 8.0.12 及更早版本: 只要服务器已正确配置为使用 SSL,则 Connector/J 客户端无需配置任何内容即可使用加密连接(例外情况是 Connector/J 连接到非常旧的服务器版本,如 5.6.25 及更早版本或 5.7.5 及更早版本,在这种情况下,客户端必须设置连接属性 useSSL=true 才能使用加密连接)。客户端可以通过设置连接属性 requireSSL=true 来要求使用 SSL;如果服务器未配置为使用 SSL,则连接将失败。如果没有 requireSSL=true,如果服务器未配置为使用 SSL,则连接将回退到非加密模式。

对于 8.0.13 及更高版本: 只要服务器已正确配置为使用 SSL,则 Connector/J 客户端无需配置任何内容即可使用加密连接。客户端可以通过设置连接属性 sslMode=REQUIREDVERIFY_CAVERIFY_IDENTITY 来要求使用 SSL;如果服务器未配置为使用 SSL,则连接将失败。使用 sslMode=PREFERRED,如果服务器未配置为使用 SSL,则连接将回退到非加密模式。对于 X 协议连接,连接属性 xdevapi.ssl-mode 指定 SSL 模式设置,就像 sslMode 对 MySQL 协议连接所做的那样(除了 X 协议不支持 PREFERRED);如果未显式设置,xdevapi.ssl-mode 将采用 sslMode 的值(如果未设置 xdevapi.ssl-mode 并且 sslMode 设置为 PREFERRED,则 xdevapi.ssl-mode 设置为 REQUIRED)。

为了提高安全性,您可以为客户端设置单向(服务器或客户端)或双向(服务器和客户端)SSL 身份验证,允许客户端或服务器相互验证身份。

TLS 版本: 可以使用连接属性 tlsVersions 和(对于 X DevAPI 连接以及 8.0.19 及更高版本)xdevapi.tls-versions 来限制允许的 TLS 协议版本(如果未指定 xdevapi.tls-versions,则它将采用 tlsVersions 的值)。如果未指定此类限制,Connector/J 将尝试使用 TLSv1.2 和 TLSv1.3 连接到服务器。

注意
  • 从 Connector/J 8.0.28 开始,连接属性 enabledTLSProtocols 已重命名为 tlsVersionsenabledSSLCipherSuites 已重命名为 tlsCiphersuites;原始名称仍然作为别名保留。

  • 对于 Connector/J 8.0.26 及更高版本: TLSv1 和 TLSv1.1 在 Connector/J 8.0.26 中已弃用,并在 8.0.28 版本中已删除;已删除的值被认为对连接选项和会话设置无效。可以使用更安全的 TLSv1.2 和 TLSv1.3 协议建立连接。使用 TLSv1.3 要求服务器使用 OpenSSL 1.1.1 或更高版本进行编译,并且 Connector/J 使用支持 TLSv1.3 的 JVM 运行(例如,Oracle Java 8u261 及更高版本)。

  • 对于 Connector/J 8.0.18 及更早版本(使用 JDBC API 连接到 MySQL Community Server 5.6 和 5.7 时): 由于与使用 yaSSL 编译的 MySQL 服务器存在兼容性问题,因此 Connector/J 默认情况下不会启用与 TLSv1.2 及更高版本的连接。当连接到将连接限制为使用更高 TLS 版本的服务器时,请通过设置 Connector/J 连接属性 enabledTLSProtocols 明确启用它们(例如,设置 enabledTLSProtocols=TLSv1.2,TLSv1.3)。

密码套件: 从 8.0.19 版本开始,Connector/J 可使用的密码套件已通过一个属性文件进行预先限制,该文件可以在源代码树的 src 文件夹中的 src/main/resources/com/mysql/cj/TlsSettings.properties 中找到,或者在 Connector/J 的平台无关发行版存档(以 .tar.gz.zip 格式)中找到。该文件包含四个部分,分别列出必需的、批准的、已弃用的和不可接受的密码套件。只有前三个部分中列出的套件才能使用。最后一部分(不可接受)定义模式或掩码,用于阻止不安全的密码套件。实际上,由于前三个部分中已经给出了允许列表,因此第四部分中的阻止列表模式是多余的;但是它们作为额外的保障措施,可以防止使用不需要的密码套件。密码套件的允许列表和阻止列表适用于 JDBC 和 X DevAPI 连接。

可以使用连接属性 tlsCiphersuites 和(对于 X DevAPI 连接以及 8.0.19 及更高版本)xdevapi.tls-ciphersuites 来限制 SSL 连接允许的密码套件(如果未指定 xdevapi.tls-ciphersuites,则它将采用 tlsCiphersuites 的值)。如果未指定此类限制,Connector/J 将尝试使用服务器接受的任何允许列表中的密码套件建立 SSL 连接。