通过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认证方式。
- 下载ca证书或捆绑包。
- 在“实例管理”页面,单击实例名称进入“基本信息”页面。
- 在“数据库信息”区域,单击“ssl”开关右侧的。
- 使用keytool工具通过ca证书生成truststore文件。
./keytool.exe -importcert -alias -file -keystore -storepass 表1 变量说明 变量
说明
请替换为jdk或jre安装路径的bin目录,例如c:\program files (x86)\java\jdk11.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
- 通过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证书。
- 通过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
- mysql-connector-java-5.1.xx.jar(对于8.0.18及以前版本的连接驱动,使用enabledtlsprotocols参数,详见)
意见反馈
文档内容是否对您有帮助?
如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨