通过JDBC连接实例的方式有无需下载SSL证书连接和用户下载SSL证书连接两种,其中使用SSL证书连接通过了加密功能,具有更高的安全性。MySQL新实例默认关闭SSL数据加密,开启SSL请参考设置SSL数据加密。SSL连接实现了数据加密功能,但同时也会增加网络连接响应时间和CPU消耗,不建议开启SSL数据加密。
前提条件
用户需要具备以下技能:
- 熟悉计算机基础知识。
- 了解JAVA编程语言。
- 了解JDBC基础知识。
使用SSL证书连接
说明使用SSL证书连接实例,即通过证书校验并连接数据库。
-
下载CA证书。
- 在天翼云官网首页的顶部菜单栏,选择产品 > 数据库 > 关系型数据库 > 关系数据库MySQL版,进入关系数据库MySQL产品页面。然后单击管理控制台,进入TeleDB数据库概览页面。
- 在左侧导航栏,选择MySQL > 实例管理,进入实例列表页面。然后在顶部菜单栏,选择区域和项目。
- 在实例列表中,单击目标实例名称,进入实例基本信息页面。
- 在网络区域,单击SSL状态参数右侧的下载证书。
-
使用keytool工具通过CA证书生成truststore文件。
说明Keytool是Java开发工具包中的一个命令行工具,可用于管理密钥和证书。
如果您的系统中安装了Java并配置了正确的环境变量,则可以直接使用keytool命令。
如果您的系统中没有安装Java,请先安装Java,然后配置环境变量再使用keytool命令。
keytool.exe -importcert -alias <MySQLCACert> -file <ca.pem> -keystore <truststore_file> -storepass <password>
变量 说明 <MySQLCACert> 请设置truststore文件的名称。建议设置为具有业务意义的名称,便于后续识别。 <ca.pem> 请替换为下载的CA证书的名称,ca.pem。 <truststore_file> 请设置truststore文件的存放路径。 <password > 请设置truststore文件的密码。 代码示例(使用JDK安装路径下的keytool工具生成truststore文件):
Owner: OID.0.9.2342.19200300.100.1.3=Sample@chinatelecom.cn, CN=ca.ctyun.com, OU=DataBaseGroup, O=CloudCenter, L=GuangZhou, ST=GuangDong, C=CN Issuer: OID.0.9.2342.19200300.100.1.3=Sample@chinatelecom.cn, CN=ca.ctyun.com, OU=DataBaseGroup, O=CloudCenter, L=GuangZhou, ST=GuangDong, C=CN Serial number: b0db70460527a4df Valid from: Tue Mar 21 15:40:12 CST 2023 until: Fri Mar 18 15:40:12 CST 2033 Certificate fingerprints: MD5: A6:9G:E5:5C:10:E4:F4:18:84:66:76:23:54:92:4C:8A SHA1: 23:66:FE:D4:83:24:58:69:B5:F6:28:04:8D:AA:FB:0E:B0:B9:F9:CB SHA256: 3F:C9:C7:EA:3F:8E:9F:6E:71:7E:5C:7A:81:44:0B:EA:51:CB:EA:7F:9C:00:3A:CF:6E:B8:64:9D:16:62:73:91 Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: Trust this certificate? [no]: y Certificate was added to keystore
-
通过JDBC连接MySQL数据库,代码中的JDBC链接格式如下:
jdbc:mysql://<instance_ip>:<instance_port>/<db_name>? requireSSL=<valuea>&useSSL=<valueb>&verifyServerCertificate=<valuec>&trustCertificateKeyStoreUrl=file: <truststore_file>&trustCertificateKeyStorePassword=<password>
参数 说明 <instance_ip> 请替换为实例的IP地址。
说明:如果通过弹性云主机连接,“instance_ip”是实例的“内网地址”。您可以在该实例“基本信息”页面的“实例信息”区域查看连接地址。如果通过公网连接,“instance_ip”为该实例已绑定的“弹性公网IP”。<instance_port> 请替换为实例的数据库端口,默认为13049。
说明:您可以在该实例“连接管理”页面的“连接信息”区域查看。<db_name> 替换为连接实例使用的数据库名,默认为mysql。 <valuea> requireSSL的值,用于设置服务端是否支持SSL连接。取值如下:true:支持。false:不支持。 <valueb> useSSL的值,用于设置客户端是否使用SSL连接服务端。取值如下:true:使用。false:不使用。 <valuec> verifyServerCertificate的值,客户端是否校验服务端的证书。取值如下:true:校验。false:不校验。 <truststore_file> 替换为truststore文件设置的存储路径。 <password > 替换为truststore文件设置的密码。 requireSSL参数应用说明
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 JDBCConnTest { public static void main(String[] args) { Connection conn = null; Statement stmt = null; String url = "jdbc:mysql://instance_ip:13049/dbname? requireSSL=true&useSSL=true&verifyServerCertificate=true&trustCertificateKeyStoreUrl=file: <truststore_file>&trustCertificateKeyStorePassword=<password>"; try { Class.forName("com.mysql.cj.jdbc.Driver"); String USER = "xxx"; String PASSOWRD = "xxx"; conn = DriverManager.getConnection(url, USER, PASSOWRD ); 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.println(rs.getMetaData().getColumnName(i)); } while (rs.next()) { System.out.println(); for (int i = 1; i <= columns; i++) { System.out.println(rs.getObject(i)); } } rs.close(); stmt.close(); conn.close(); } catch (SQLException se) { se.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { // 释放资源 } } }
无证书连接
说明该方式不对服务端进行证书校验,用户无需下载SSL证书。
-
通过JDBC连接MySQL数据库实例,代码中的JDBC链接格式如下:
jdbc:mysql://<instance_ip>:<instance_port>/<database_name>?useSSL=false
变量 说明 <instance_ip> 请替换为实例的IP地址。
说明:如果通过弹性云主机连接,“instance_ip”是实例的“内网地址”。您可以在该实例“基本信息”或“连接管理”页面的“连接信息”区域查看。如果通过公网连接,“instance_ip”为该实例已绑定的“弹性公网IP”。您可以在该实例“连接管理”页面的“连接信息”区域查看。<instance_port> 请替换为实例的数据库端口,默认为13049。
说明:您可以在该实例“连接管理”页面的“连接信息”区域查看。<database_name> 请替换为连接实例使用的数据库名,默认为mysql。 代码示例(连接MySQL数据库的java代码):
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class NoneCaConnTest { final public static void main(String[] args) { Connection conn = null; String url = "jdbc:mysql://instance_ip:13049/db_test?useSSL=false"; try { Class.forName("com.mysql.jdbc.Driver"); String USER = "xxx"; String PASSOWRD = "xxx"; conn = DriverManager.getConnection(url, USER , PASSOWRD ); System.out.println("Database is connected"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM table WHERE column = 100"); while (rs.next()) { System.out.println(rs.getString(1)); } rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); System.out.println("Test no ca failed"); } finally { // 释放资源 } } }