10bet网址
连接器和API手册
下载本手册

3.5.8使用SSL安全连接

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

系统通过两个Java密钥库文件工作:一个文件包含服务器的证书信息(托管库另一个包含客户端的密钥和证书(密钥库在下面的例子中)。所有Java密钥库文件都由提供给钥匙工具当你创建文件的时候。您需要文件名和相关的密码来创建SSL连接。

要使SSL支持正常工作,必须具备以下条件:

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

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

对于8.0.13及更高版本:只要服务器被正确配置为使用SSL,就不需要在Connector/J客户机上配置任何东西来使用加密连接。客户机可以通过设置connection属性来要求使用SSLsslMode=必需,验证\u CA,或验证\u身份; 如果服务器没有配置为使用SSL,那么连接就会失败。与sslMode=首选,如果服务器没有配置为使用SSL,则连接将返回到非加密模式。对于X协议连接,connection属性xdevapi.ssl-模式指定SSL模式设置,就像SSL模式不支持MySQL协议连接(除了首选X协议不支持);如果没有明确设置,xdevapi.ssl-模式占据了SSL模式(如果xdevapi.ssl-模式未设置和SSL模式设置为首选,xdevapi.ssl-模式设置为必修的).

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

TLS版本:可以使用连接属性限制TLS协议的允许版本启用的TLS协议对于X DevAPI连接和8.0.19及更高版本,xdevapi.tls-版本(何时xdevapi.tls-版本如果未指定,则它将占用启用的TLS协议). 如果未指定此类限制,Connector/J将尝试使用以下TLS版本连接到服务器:

  • TLSv1、TLSv1.1、TLSv1.2、TLSv1.3适用于MySQL社区服务器8.0、5.7.28及更高版本、5.6.46及更高版本,以及MySQL服务器的所有商业版本。

  • TLSv1、TLSv1.1适用于所有其他版本的MySQL服务器。

注意

对于Connector/J 8.0.18及更早版本,当使用JDBC API连接到MySQL Community Server 5.6和5.7时:由于与用yaSSL编译的MySQL服务器的兼容性问题,Connector/J默认情况下不启用与TLSv1.2及更高版本的连接。当连接到限制连接使用那些更高TLS版本的服务器时,通过设置Connector/J connection属性显式启用它们启用的TLS协议(例如,设置EnabledTLS协议=TLSv1、TLSv1.1、TLSv1.2).

密码套件:从8.0.19版开始,Connector/J可用的密码套件就受到一个属性文件的预先限制,该文件位于src/main/resources/com/mysql/cj/TlsSettings.properties文件内部src公司源目录树或独立于平台的分发存档中的文件夹(在.焦油.gz.zip文件格式)用于连接器/J。该文件包含四个部分,分别列出了强制密码、已批准密码、已弃用密码和不可接受密码。只能使用前三节中列出的套件。最后一节(不可接受)定义了阻止列出不安全密码套件的模式或掩码。实际上,由于前三节中已经给出了allowlist,第四节中的blocklist模式是多余的;但它们是作为一个额外的保护措施,防止不必要的密码。密码套件的allowlist和blocklist同时适用于JDBC和X DevAPI连接。

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

设置服务器身份验证

对于8.0.12及更早版本:当连接器/J连接属性使用SSL以及验证服务器证书都是真的。不支持主机名验证仅通过证书进行主机身份验证。

对于8.0.13及更高版本:当连接器/J连接属性SSL模式设置为验证\u CA验证\u身份. 如果SSL模式如果未设置,则在旧属性使用SSL以及验证服务器证书都是真的。

由可信CA签名的证书。当启用通过服务器证书验证进行服务器身份验证时,如果没有进行有关服务器身份验证的其他配置,Java将使用其默认的受信任CA证书(通常来自)验证服务器证书$JAVA\u主页/lib/security/cacerts.

使用自签名证书。MySQL服务器证书自签名或由自签名CA证书签名是很常见的;MySQL服务器创建的自动生成的证书和密钥基于后者,即服务器生成所有必需的密钥和自签名CA证书,用于对服务器和客户端证书进行签名。然后服务器将自己配置为使用CA证书和服务器证书。尽管客户端证书文件位于同一目录中,但服务器不使用它。

要验证服务器证书,Connector/J需要能够读取对其进行签名的证书,即,对自身进行签名的服务器证书或自签名的CA证书。这可以通过导入证书来完成(加利福尼亚州佩姆或任何其他证书),或通过将其导入自定义Java信任库文件并相应地配置Connector/J驱动程序。使用Java的keytool(通常位于箱子要导入服务器证书,请执行以下操作:

shell>keytool-importcert-别名迈斯克卡塞特-文件ca.pem \-密钥库信任库-storepass我的密码

为命令选项提供正确的参数。如果信任库文件不存在,则创建一个新的信任库文件;否则,证书将添加到现有文件中。与…互动钥匙工具看起来像这样:

所有者:CN=MySQL\u Server\u 5.7.17\u Auto\u Generated\u CA\u证书颁发者:CN=MySQL\u Server\u 5.7.17\u Auto\u Generated\u CA\u证书序列号:1有效期:2017年2月16日星期四11:42:43至:2027年2月14日星期日11:42:43证书指纹:MD5:18:87:97:37:EA:CB:0B:5A:24:AB:27:76:45:A4:78:C1:2B:0D:D9:69:2C:99:BF:1E:2A:25:4E:8D:2D:38:B8:70:66:47:FA:ED SHA256:C3:29:67:1B:E5:37:06:F7:A9:93:DF:C7:B3:27:5E:09:C7:FD:EE:2D:18:86:F4:9C:40:D8:26:CB:DA:95:A0:24签名算法名称:SHA256withRSA主题公钥算法:2048位RSA密钥版本:1信任此证书[否]:是证书已添加到密钥库

命令的输出显示有关导入证书的所有详细信息。确保记住您提供的密码。另外,请注意,密码必须以纯文本形式写入Connector/J配置文件或应用程序源代码中。

下一步是配置Java或Connector/J来读取刚刚创建或修改的信任库。这可以通过以下三种方法之一实现:

  1. 使用Java命令行参数:

    -Djavax.net.ssl.trustStore信任库=指向信任库文件的路径-Djavax.net.ssl.trustStorePassword密码=我的密码

  2. 直接在客户端代码中设置系统属性:

    System.setProperty(“javax.net.ssl.trustStore”指向信任库文件的路径"); System.setProperty(“javax.net.ssl.trustStorePassword”,“我的密码");

  3. 设置连接器/J连接属性:

    trustCertificateKeyStoreUrl=文件:指向信任库文件的路径信任证书KeyStorePassword=我的密码

请注意,当一起使用时,连接属性将覆盖由其他两个方法设置的值。此外,使用连接属性设置的任何值仅用于该连接,而使用系统范围值设置的值用于所有连接(除非由连接属性重写)。对于接头/J 8.0.22及更高版本:设置连接属性回退到系统信任库当方法(3)未使用时,防止连接器/J退回到使用方法(1)或(2)创建的系统范围信任库设置。

通过上述设置和启用服务器身份验证,所有建立的连接都将进行SSL加密,服务器将在SSL握手过程中进行身份验证,客户机现在可以安全地信任它所连接的服务器。

对于X协议连接,连接属性xdevapi.ssl-信任库,xdevapi.ssl-truststore-type,xdevapi.ssl-truststore-password密码,和xdevapi.ssl-fallbackToSystemTrustStore指定信任库设置,就像信任证书KeyStoreURL,信任证书KeyStoreType,信任证书KeyStorePasswordamd公司回退到系统信任库MySQL协议连接的do;如果没有明确设置,xdevapi.ssl-信任库,xdevapi.ssl-truststore-type,xdevapi.ssl-truststore-password密码,和xdevapi.ssl-fallbackToSystemTrustStore接受信任证书KeyStoreURL,信任证书KeyStoreType,信任证书KeyStorePassword,和回退到系统信任库分别。

服务身份验证。对于8.0.13及更高版本:通过服务器证书验证超越服务器身份验证,当SSL模式设置为验证\u身份,连接器/J还通过检查用于连接的主机名是否与服务器证书中的公用名值匹配来执行主机名身份验证。

设置客户端身份验证

服务器可能希望对客户机进行身份验证,并要求客户机向其提供SSL证书,然后根据其已知的证书颁发机构进行验证,或者在需要时对客户机标识执行附加检查(请参阅)创建用户SSL/TLS选项详细信息)。在这种情况下,Connector/J需要具有对客户机证书的访问权限,以便在建立新的数据库连接时将其发送到服务器。这是使用javakeystore文件完成的。

要允许客户端身份验证,连接到服务器的客户端必须有自己的密钥集和SSL证书。必须对客户端证书进行签名,以便服务器可以对其进行验证。虽然可以由官方证书颁发机构对客户端证书进行签名,但更常见的是使用中间的、私有的CA证书对客户端证书进行签名。这种中间CA证书可以是自签名的,也可以是由受信任的根CA签名的。要求是服务器知道能够验证客户端证书的CA证书。

一些MySQL服务器构建能够生成用于通信加密的SSL密钥和证书,包括证书和私钥(包含在客户端-证书.pem客户端-key.pem文件),可供任何客户端使用。此SSL证书已由自签名CA证书签名加利福尼亚州佩姆,服务器可能已配置为使用。

如果不想使用服务器生成的客户端密钥和证书文件,还可以使用中描述的过程生成新的密钥和证书文件创建SSL和RSA证书和密钥. 请注意,根据服务器的设置,您可能需要重用服务器配置为使用的现有CA证书来签署新的客户端证书,而不是创建新的客户端证书。

一旦获得了要使用的客户机私钥和证书文件,就需要将它们导入到Java密钥库中,以便javassl库和Connector/J可以使用它们。以下说明解释了如何创建密钥库文件:

  • 将客户端密钥和证书文件转换为PKCS#12存档:

    shell>openssl pkcs12-export-in client-cert.pem-inkey client-key.pem \-名称“mysql客户端“-传递传递:我的密码-出去客户端-密钥库.p12

  • 将客户端密钥和证书导入Java密钥库:

    shell>keytool-importkeystore-srceystore客户端-密钥库.p12-srcstoretype pkcs12 \-srcstorepass我的密码-destkeystore密钥库-deststoretype JKS-deststorepass我的密码

    为命令选项提供正确的参数。如果密钥库文件不存在,将创建一个新的密钥库文件;否则,证书将添加到现有文件中。输出方式钥匙工具看起来像这样:

    已成功导入别名mysqlclient的条目。导入命令已完成:1个条目成功导入,0个条目失败或取消

    确保记住所选的密码。另外,请注意,密码必须以纯文本形式写入Connector/J配置文件或应用程序源代码中。

完成此步骤后,您可以删除PKCS#12存档(客户端-密钥库.p12在示例中)。

下一步是配置Java或Connector/J,以便它读取刚刚创建或修改的密钥库。这可以通过以下三种方法之一实现:

  1. 使用Java命令行参数:

    -Djavax.net.ssl.keyStore=指向密钥库文件的路径-Djavax.net.ssl.keystrepassword=我的密码

  2. 直接在客户端代码中设置系统属性:

    System.setProperty(“javax.net.ssl.keyStore”,”指向密钥库文件的路径"); System.setProperty(“javax.net.ssl.keyStorePassword”,”我的密码");

  3. 直通连接器/J连接属性:

    clientCertificateKeyStoreUrl=文件:指向信任库文件的路径客户端证书KeyStorePassword=我的密码

请注意,当一起使用时,连接属性将覆盖由其他两个方法设置的值。此外,使用连接属性设置的任何值仅用于该连接,而使用系统范围值设置的值用于所有连接(除非由连接属性重写)。对于接头/J 8.0.22及更高版本:设置连接属性回退到系统密钥库当方法(3)未使用时,防止连接器/J退回到使用方法(1)或(2)创建的系统范围密钥库设置。

通过上述设置,所有建立的连接都将通过SSL握手过程中验证的客户端进行SSL加密,服务器现在可以安全地信任请求连接的客户端。

对于接头/J 8.0.22及更高版本:对于X协议连接,连接属性xdevapi.ssl密钥库,xdevapi.ssl-keystore-type,xdevapi.ssl-keystore-password密码,和xdevapi.ssl-fallbackToSystemKeyStore指定密钥库设置,就像信任证书KeyStoreURL,信任证书KeyStoreType,信任证书KeyStorePassword,和回退到系统密钥库MySQL协议连接的do;如果没有明确设置,xdevapi.ssl密钥库,xdevapi.ssl-keystore-type,xdevapi.ssl-keystore-password密码,和xdevapi.ssl-fallbackToSystemKeyStore接受clientCertificateKeyStoreUrl,客户证书KeyStoreType,客户端证书KeyStorePassword,和回退到系统密钥库分别。

设置双向身份验证

应用两个步骤中概述的步骤设置服务器身份验证设置客户端身份验证设置双向双向身份验证过程,在该过程中,服务器和客户端在建立连接之前相互进行身份验证。

尽管上面描述的典型设置在两端使用相同的CA证书进行相互认证,但不一定是这样。唯一的要求是服务器配置的CA证书必须能够验证客户端证书,导入到客户端信任库的CA证书必须能够验证服务器证书;两端使用的两个CA证书可以是不同的。

调试SSL连接

JSSE提供调试信息给标准设置系统属性时-Djavax.net.debug=全部. Java然后告诉您正在使用什么密钥库和信任库,以及SSL握手和证书交换期间发生了什么。当您尝试调试失败的SSL连接时,这将非常有用。