Connector/J 可以使用 SSL 对 JDBC 驱动程序和服务器之间通信的所有数据进行加密(初始握手除外)。启用连接加密会带来性能损失,其严重程度取决于多个因素,包括(但不限于)查询的大小、返回的数据量、服务器硬件、使用的 SSL 库、网络带宽等。
该系统通过两个 Java 密钥库文件工作:一个文件包含服务器的证书信息(在以下示例中为 truststore
),另一个文件包含客户端的密钥和证书(在以下示例中为 keystore
)。所有 Java 密钥库文件都由您在创建文件时提供给 keytool 的密码保护。您需要文件名和关联的密码才能创建 SSL 连接。
为了使 SSL 支持正常工作,您必须具备以下条件
支持 SSL 的 MySQL 服务器,并且已编译和配置为支持 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=REQUIRED
、VERIFY_CA
或 VERIFY_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
已重命名为tlsVersions
,enabledSSLCipherSuites
已重命名为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 连接。