通过jdbc连接rds for mysql实例-九游平台
通过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://
: / ?param1=value1¶m2=value2 表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。
trustcertificatekeystoreurl,取值为file:
。 请替换为2中truststore文件设置的存储路径。 trustcertificatekeystorepassword,取值为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; // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。 // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)example_username_env和example_password_env。 public class jdbctest { string user = system.getenv("example_username_env"); string pass = system.getenv("example_password_env"); public static void main(string[] args) { connection conn = null; statement stmt = null; // url中所需的连接参数根据实际情况配置 string url = "jdbc:mysql://
: / ?param1=value1¶m2=value2"; 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; // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。 // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)example_username_env和example_password_env。 public class myconntest { final public static void main(string[] args) { connection conn = null; // url中所需的连接参数根据实际情况配置 string url = "jdbc:mysql://
: / ?param1=value1¶m2=value2"; string user = system.getenv("example_username_env"); string pass = system.getenv("example_password_env"); try { class.forname("com.mysql.jdbc.driver"); conn = drivermanager.getconnection(url,user,pass); 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参数,详见)
在数据库连接url:jdbc:mysql://
: / ?param1=value1¶m2=value2 的末尾以param1=value1的形式增加enabledtlsprotocols=tlsv1.2 - mysql-connector-java-8.0.xx.jar(对于8.0.18以后版本的连接驱动,使用tlsversions参数)
在数据库连接url:jdbc:mysql://
: / ?param1=value1¶m2=value2 的末尾以param1=value1的形式增加tlsversions=tlsv1.2
- mysql-connector-java-5.1.xx.jar(对于8.0.18及以前版本的连接驱动,使用enabledtlsprotocols参数,详见)
相关文档
意见反馈
文档内容是否对您有帮助?
如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨