凯发k8国际娱乐官网入口-k8凯发> 云数据库 rds> > > > 通过jdbc连接rds for mysql实例
更新时间:2023-12-01 gmt 08:00

通过jdbc连接rds for mysql实例-凯发k8国际娱乐官网入口

通过jdbc连接实例的方式有无需下载ssl证书连接和用户下载ssl证书连接两种,其中使用ssl证书连接通过了加密功能,具有更高的安全性。rds for mysql新实例默认关闭ssl数据加密,开启ssl请参考设置ssl数据加密ssl连接实现了数据加密功能,但同时也会增加网络连接响应时间和cpu消耗,不建议开启ssl数据加密。

前提条件

用户需要具备以下技能:

  • 熟悉计算机基础知识。
  • 了解java编程语言。
  • 了解jdbc基础知识。

使用ssl证书连接

使用ssl证书连接实例,即通过证书校验并连接数据库。rds for mysql实例不支持x509认证方式。

  1. 下载ca证书或捆绑包。
    1. “实例管理”页面,单击实例名称进入“基本信息”页面。
    2. “数据库信息”区域,单击“ssl”开关右侧的
  2. 使用keytool工具通过ca证书生成truststore文件。
     ./keytool.exe -importcert -alias  -­file  -keystore  -storepass 
    表1 变量说明

    变量

    说明

    请替换为jdk或jre安装路径的bin目录,例如c:\program files (x86)\java\jdk­11.0.7\bin。

    请设置truststore文件的名称。建议设置为具有业务意义的名称,便于后续识别。

    请替换为1中下载解压后ca证书的名称,例如ca.pem。

    请设置truststore文件的存放路径。

    请设置truststore文件的密码。

    代码示例(使用jdk安装路径下的keytool工具生成truststore文件):

    owner:  cn=mysql_server_5.7.17_auto_generated_ca_certificate
    issuer: cn=mysql_server_5.7.17_auto_generated_ca_certificate 
    serial number: 1
    valid from: thu feb 16 11:42:43 est 2017 until: sun feb 14 11:42:43 est 2027 
    certificate fingerprints:
         md5: 18:87:97:37:ea:cb:0b:5a:24:ab:27:76:45:a4:78:c1
         sha1: 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
         signature algorithm name: sha256withrsa subject public key algorithm: 2048-bit rsa key 
         version: 1
         trust this certificate? [no]: y
         certificate was added to keystore
  3. 通过jdbc连接mysql数据库,代码中的jdbc链接格式如下:
    jdbc:mysql://:/? 
    requiressl=&usessl=&verifyservercertificate=&trustcertificatekeystoreurl=file: 
    &trustcertificatekeystorepassword=
    表2 参数说明

    参数

    说明

    请替换为实例的ip地址。

    说明:
    • 如果通过弹性云服务器连接,“instance_ip”是实例的“内网地址”。您可以在该实例“基本信息”或“连接管理”页面的“连接信息”区域查看。
    • 如果通过公网连接,“instance_ip”为该实例已绑定的“弹性公网ip”。您可以在该实例“连接管理”页面的“连接信息”区域查看。

    请替换为实例的数据库端口,默认为3306。

    说明:

    您可以在该实例“连接管理”页面的“连接信息”区域查看。

    请替换为连接实例使用的数据库名,默认为mysql。

    requiressl的值,用于设置服务端是否支持ssl连接。取值如下:

    • true:支持。
    • false:不支持。
    说明:

    requiressl与其他连接参数、sslmode之间的关系请参考表3

    usessl的值,用于设置客户端是否使用ssl连接服务端。取值如下:

    • true:使用。
    • false:不使用。
      说明:

      usessl与其他连接参数、sslmode之间的关系请参考表3

    verifyservercertificate的值,客户端是否校验服务端的证书。取值如下:

    • true:校验。
    • false:不校验。
      说明:

      verifyservercertificate与其他连接参数、sslmode之间的关系请参考表3

    请替换为2中为truststore文件设置的存储路径。

    请替换为2中为truststore文件设置的密码。

    表3 连接参数与sslmode的关系说明

    usessl

    requiressl

    verifyservercertificate

    sslmode

    false

    不涉及

    不涉及

    disabled

    true

    false

    false

    preferred

    true

    true

    false

    required

    true

    不涉及

    true

    verify_ca

    代码示例(连接mysql数据库的java代码):

    import java.sql.connection; 
    import java.sql.drivermanager; 
    import java.sql.resultset; 
    import java.sql.statement;
    import java.sql.sqlexception; 
     
    public class jdbctest { 
        static final string user = "xxx"; 
        static final string pass = "xxx";
        public static void main(string[] args) {
            connection conn = null; 
            statement stmt = null;
            string url = "jdbc:mysql://:/?
    requiressl=true&usessl=true&verifyservercertificate=true&trustcertificatekeystoreurl=file:
    &trustcertificatekeystorepassword=";
     
            try { 
                class.forname("com.mysql.cj.jdbc.driver");
                conn = drivermanager.getconnection(url, user, pass);
     
                stmt = conn.createstatement(); 
                string sql = "show status like 'ssl%'";
                resultset rs = stmt.executequery(sql); 
                int columns = rs.getmetadata().getcolumncount();
                for (int i = 1; i <= columns; i  ) {
                    system.out.print(rs.getmetadata().getcolumnname(i));
                    system.out.print("\t");
                }
                while (rs.next()) { 
                    system.out.println(); 
                    for (int i = 1; i <= columns; i  ) {
                        system.out.print(rs.getobject(i));
                        system.out.print("\t");
                    } 
                }
                rs.close(); 
                stmt.close(); 
                conn.close(); 
            } catch (sqlexception se) { 
                se.printstacktrace(); 
            } catch (exception e) { 
                e.printstacktrace(); 
            } finally { 
                // release resource .... 
            } 
        } 
    }

无证书连接

该方式不对服务端进行证书校验,用户无需下载ssl证书。

  1. 通过jdbc连接rds for mysql数据库实例,代码中的jdbc链接格式如下:
    jdbc:mysql://:/?usessl=false
    表4 变量说明

    变量

    说明

    请替换为实例的ip地址。

    说明:
    • 如果通过弹性云服务器连接,“instance_ip”是实例的“内网地址”。您可以在该实例“基本信息”或“连接管理”页面的“连接信息”区域查看。
    • 如果通过公网连接,“instance_ip”为该实例已绑定的“弹性公网ip”。您可以在该实例“连接管理”页面的“连接信息”区域查看。

    请替换为实例的数据库端口,默认为3306。

    说明:

    您可以在该实例“连接管理”页面的“连接信息”区域查看。

    请替换为连接实例使用的数据库名,默认为mysql。

    代码示例(连接mysql数据库的java代码):

    import java.sql.connection;
    import java.sql.drivermanager;
    import java.sql.resultset;
    import java.sql.statement;
    public class myconntest {
    	final public static void main(string[] args) {
    		connection conn = null;
    		// set sslmode here.
    		// no ssl certificate, so do not specify path.
    		string url = "jdbc:mysql://192.168.0.225:3306/my_db_test?usessl=false";
    		try {
    			class.forname("com.mysql.jdbc.driver");
    			conn = drivermanager.getconnection(url, "root", "password");
    			system.out.println("database connected");
    			statement stmt = conn.createstatement();
    			resultset rs = stmt.executequery("select * from mytable where columnfoo = 500");
    			while (rs.next()) {
    				system.out.println(rs.getstring(1));
    			}
    			rs.close();
    			stmt.close();
    			conn.close();
    		} catch (exception e) {
    			e.printstacktrace();
    			system.out.println("test failed");
    		} finally {
    			// release resource ....
    		}
    	}
    }

相关问题

  • 问题描述

    当您使用8.0及以上版本的jdk通过ssl证书模式连接mysql时,报如下类似错误:

    javax.net.ssl.sslhandshakeexception: no appropriate protocol (protocol is disabled or
    cipher suites are inappropriate)
        at sun.security.ssl.handshakecontext.(handshakecontext.java:171) ~[na:1.8.0_292]
        at sun.security.ssl.clienthandshakecontext.(clienthandshakecontext.java:98) ~
    [na:1.8.0_292]
        at sun.security.ssl.transportcontext.kickstart(transportcontext.java:220) ~
    [na:1.8.0_292]
        at sun.security.ssl.sslsocketimpl.starthandshake(sslsocketimpl.java:428) ~
    [na:1.8.0_292]
        at
    com.mysql.cj.protocol.exportcontrolled.performtlshandshake(exportcontrolled.java:316) ~
    [mysql-connector-java-8.0.17.jar:8.0.17]
        at
    com.mysql.cj.protocol.standardsocketfactory.performtlshandshake(standardsocketfactory.java
    :188) ~[mysql-connector-java8.0.17.jar:8.0.17]
        at
    com.mysql.cj.protocol.a.nativesocketconnection.performtlshandshake(nativesocketconnection.
    java:99) ~[mysql-connector-java8.0.17.jar:8.0.17]
        at
    com.mysql.cj.protocol.a.nativeprotocol.negotiatesslconnection(nativeprotocol.java:331) ~
    [mysql-connector-java8.0.17.jar:8.0.17]
    ... 68 common frames omitted
  • 解决方法

    您可以在3中的代码链路中,根据客户端使用的jar包指定对应参数值进行连接。示例如下:

    • mysql-connector-java-5.1.xx.jar(对于8.0.18及以前版本的连接驱动,使用enabledtlsprotocols参数,详见)
      jdbc:mysql://:/? 
       requiressl=true&usessl=true&verifyservercertificate=true&trustcertificatekeystoreurl=file: 
       &trustcertificatekeystorepassword=&enabledtlsprotocols=tlsv1.2
    • mysql-connector-java-8.0.xx.jar(对于8.0.18以后版本的连接驱动,使用tlsversions参数)
      jdbc:mysql://:/? 
       requiressl=true&usessl=true&verifyservercertificate=true&trustcertificatekeystoreurl=file: 
       &trustcertificatekeystorepassword=&tlsversions=tlsv1.2
分享:
网站地图