MySQL配置SSL访问-WEB配置JDBC支持SSL

2023-05-16

WEB配置JDBC支持SSL

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

系统通过两个 Java 密钥库文件工作:一个文件包含服务器的证书信息(truststore在下面的示例中),另一个包含客户端的密钥和证书(keystore在下面的示例中)。所有 Java 密钥库文件都受到创建文件时提供给keytool的密码的保护 。您需要文件名和关联的密码才能创建 SSL 连接。

要使 SSL 支持起作用,您必须具备以下条件:

  • 一个支持 SSL 的 MySQL 服务器,并被编译和配置为这样做。

  • 签名的客户端证书,如果使用 双向(双向)身份验证。

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

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

为了提高安全性,您可以将客户端设置为单向(服务器或客户端)或双向(服务器和客户端)SSL 身份验证,允许客户端或服务器验证彼此的身份。

设置服务器身份验证

当连接器/J 连接属性verifyServerCertificate为 true(这是 时的默认设置 useSSL=true)时,通过服务器证书验证启用服务器身份验证 。

要验证服务器证书,Connector/J 需要能够读取为其签名的证书,即自己签名的服务器证书或自签名 CA 证书。这可以通过将证书(ca.pem或任何其他证书)导入 Java 默认信任库(尽管不建议篡改默认信任库)或通过将其导入自定义 Java 信任库文件并相应地配置连接器/J 驱动程序来实现。使用 Java 的 keytool(通常位于binJDK 或 JRE 安装的子目录中)导入服务器证书:

$> keytool -importcert -alias MySQLCACert -file ca.pem \
    -keystore truststore.jks -storepass mypassword

设置java数据库连接字符串

// mysql 5
Class.forName("com.mysql.jdbc.Driver").newInstance();
// mysql 8
//	Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
String url = "jdbc:mysql://192.168.5.132:3306/test?"
	+ "useSSL=true"
	+ "&verifyServerCertificate=true"
	+ "&requireSSL=true"
	+ "&trustCertificateKeyStoreUrl=file:D:/ssl.132/truststore.jks"
	+ "&trustCertificateKeyStorePassword=mypassword";

设置客户端身份验证

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

$> openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem \
  -name "mysqlclient" -passout pass:mypassword -out client-keystore.p12

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

$> keytool -importkeystore -srckeystore client-keystore.p12 -srcstoretype pkcs12 \
 -srcstorepass mypassword -destkeystore keystore.jks -deststoretype JKS -deststorepass mypassword

设置java数据库连接字符串

String url = "jdbc:mysql://192.168.5.132:3306/test?"
	+ "useSSL=true"
	+ "&verifyServerCertificate=true"
	+ "&requireSSL=true"
	+ "&trustCertificateKeyStoreUrl=file:D:/ssl.132/truststore.jks"
	+ "&trustCertificateKeyStorePassword=mypassword"
	+ "&clientCertificateKeyStoreUrl=file:D:/ssl.132/keystore.jks"
	+ "&clientCertificateKeyStorePassword=mypassword";

调试 SSL 连接

JSSE 会stdout 在您设置系统属性时 提供调试信息

-Djavax.net.debug=all

然后 Java 会告诉您正在使用哪些密钥库和信任库,以及在 SSL 握手和证书交换期间发生了什么。当您尝试调试失败的 SSL 连接时,这会很有帮助。

完整java示例

import java.sql.*;

public class TestMysqlSSL {
	/**
	 * ssl调试参数:-Djavax.net.debug=all
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		testSSL();
	}

	/**
	 */
	private static void testSSL() {
		try {
			// mysql 5
			Class.forName("com.mysql.jdbc.Driver").newInstance();

			// mysql 8
//			Class.forName("com.mysql.cj.jdbc.Driver").newInstance();

			// 1.服务端开启SSL,客户端强制SSL连接
			// ALTER USER 'u1'@'192.168.5.1' REQUIRE SSL;
//			String url = "jdbc:mysql://192.168.5.132:3306/test?"
//					+ "useSSL=true"
//					+ "&verifyServerCertificate=false"
//					+ "&requireSSL=true";

			// 2. 服务端开启SSL,验证服务端证书
			// ALTER USER 'u1'@'192.168.5.1' REQUIRE SSL;
//			String url = "jdbc:mysql://192.168.5.132:3306/test?"
//					+ "allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true"
//					+ "&useSSL=true"
//					+ "&verifyServerCertificate=true"
//					+ "&requireSSL=true"
//					+ "&trustCertificateKeyStoreUrl=file:D:/dev/mysql/ssl.132/truststore.jks"
//					+ "&trustCertificateKeyStorePassword=mypassword";

			// 3. 服务端开启SSL,配置证书,客户端连服务端,配置双向验证服务端证书和客户端证书
			// ALTER USER 'u1'@'192.168.5.1' REQUIRE X509; // 如果配置为X509,必须使用以下方式连接mysql
			String url = "jdbc:mysql://192.168.5.132:3306/test?" 
					+ "useSSL=true" 
					+ "&verifyServerCertificate=true"
					+ "&requireSSL=true" 
					+ "&trustCertificateKeyStoreUrl=file:D:/dev/mysql/ssl.132/truststore.jks"
					+ "&trustCertificateKeyStorePassword=mypassword"
					+ "&clientCertificateKeyStoreUrl=file:D:/dev/mysql/ssl.132/keystore.jks"
					+ "&clientCertificateKeyStorePassword=mypassword";

			String user = "u1";
			String password = "abcd@123";
			System.out.println("连接数据库");
			Connection conn = DriverManager.getConnection(url, user, password);
			System.out.println("连接正常!");

			PreparedStatement ps = conn.prepareStatement("SELECT sysdate() as t ");
			ResultSet rs = ps.executeQuery();
			rs.next();
			System.out.println("T=" + rs.getObject(1));
			conn.close();
		} catch (Exception sqle) {
			System.out.print(sqle);

		}
	}
}

参考

https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-using-ssl.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL配置SSL访问-WEB配置JDBC支持SSL 的相关文章

  • 当“修复表”查询在 mysql 中不起作用时该怎么办?

    我收到此错误 表的存储引擎不支持修复 当我尝试使用查询修复表时repair table tbl college master 表是 innodb 类型 但我不知道我收到此错误 See 手册 http dev mysql com doc re
  • MySql 最后插入 ID,连接器 .net

    我正在使用 MySql Connector net 我需要获取最后一个查询生成的插入 id 现在 我假设返回值是MySqlHelper ExecuteNonQuery应该是最后一个插入id 但它只返回1 我正在使用的代码是 int inse
  • 为什么 MySQL 创建带有 _seq 后缀的表?

    我创建了一个 InnoDB 表 名为foo在 MySQL 中 一旦我对表执行插入操作 我就会看到另一个表foo seq被建造 如果我删除自动生成的表 它会在下一次插入后出现 是什么原因造成的 听起来像是正在创建一个序列 您是否有自动生成的主
  • 无法启动 MySQL 服务器 - 控制进程退出并出现错误代码

    我的 mysql 服务器停止后无法启动 命令使用 sudo etc init d mysql restart Error 重新启动 mysql 通过 systemctl mysql serviceJob for mysql service
  • 当sql连接中存在两个同名列时,如何从一个表列中获取值

    当我连接两个具有相同名称列的表时 我目前面临着尝试获取值的问题 例如 table1 date和table2 date 每个表中的日期不同 我将如何获取 日期 本例中的表1 我目前正在跑步 while row mysqliquery gt f
  • MySQL 使用 ALTER IGNORE TABLE 出现重复错误

    我的 MySQL 中有一个有重复项的表 我尝试删除重复项并保留一项 我没有主键 我可以通过以下方式找到重复项 select user id server id count as NumDuplicates from user server
  • 如何正确转义mysql?

    我刚刚发现如果我写 select from tbl where name like foo 然后添加 foo 作为参数及其值 a 用户数据 它不会正确转义 我勒个去 它想要 a 即使我使用参数 我还是忍不住觉得我对 sql 注入持开放态度
  • 如何在Sequelize中设置查询超时?

    我想看看如何在 Sequelize 中设置查询的超时时间 我查看了 Sequelize 文档以获取一些信息 但我找不到我要找的东西 我发现的最接近的是 pools acquire 选项 但我不想设置传入连接的超时 而是设置正在进行的查询的超
  • Apache、PHP 和 MySQL 可移植吗?

    我可以在外部硬盘上运行 Apache PHP 和 MySQL 吗 我需要这个 因为我在不同的地方工作 计算机 有时我没有安装和配置所有使用的应用程序 当然可以 XAMPP http www apachefriends org en xamp
  • 将 SSLSetEnabledCiphers 与 AFNetworking 结合使用来禁用弱密码

    我正在尝试禁用一些密码 弱 例如单个 DES 单个 DES 40 位等 我尝试过使用这段代码在 Cocoa 中使用 CFSocket CFStream 时如何设置 SSL 密码 https stackoverflow com questio
  • 忽略重复条目并在 EF Core 中的 DbContext.SaveChanges() 上提交成功条目

    我有一个 ASP Net Core 2 2 Web API 在我的一个控制器操作中 我向 MySQL 数据库表添加了一堆行 我使用的是 Pomelo 例如 dbContext AddRange entities dbContext Save
  • MySQL连接字符集问题

    我在 Mac 上使用带有 MySQL 的 velosurf 没有任何编码问题 但是当我切换到 Linux 计算机时 从 velosurf 获得的值未正确编码 我发现这可能是默认连接字符集的问题 在 Mac 上我得到 mysql gt sho
  • 如何将ElasticSearch与MySQL集成?

    在我的一个项目中 我计划将 ElasticSearch 与 MySQL 结合使用 我已经成功安装ElasticSearch 我可以单独管理ES中的索引 但我不知道如何用 MySQL 实现同样的功能 我读过一些文件 但我有点困惑 没有明确的想
  • MySQL 查询到 CSV [重复]

    这个问题在这里已经有答案了 有没有一种简单的方法来运行MySQL查询来自linux命令行并以csv格式输出结果 这就是我现在正在做的事情 mysql u uid ppwd D dbname lt lt EOQ sed e s g tee l
  • Bugzilla 中分离客户端的基本权限

    我正在尝试配置一个 Bugzilla 实例 这将允许我的客户登录并为其正在开发 维护的网站提交错误 例如 我创建了 2 个名为 TestProject TestProject2 的产品和一个名为 TestClient 的用户 我想要实现的是
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 如何使用 SparkR 1.6.0 写入 JDBC 源?

    使用 SparkR 1 6 0 我可以使用以下代码从 JDBC 源读取数据 jdbc url lt jdbc mysql localhost 3306 dashboard user
  • 在 PHP 字符串中格式化 MySQL 代码

    是否有任何程序 IDE 可以在 PHP 字符串中格式化 MySQL 代码 例如 我使用 PHPStorm IDE 但它无法做到这一点 它对 PHP 和 MYSQL 执行此操作 但不适用于 php 字符串内的 MYSQL 我已准备好使用新的
  • 使用其他聚合中的数据检查命令的有效性

    我目前正在开发我的第一个更大的 DDD 应用程序 目前来说 它运行得很好 但我们从早期就陷入了一个让我无法停止思考的问题 在我们的一些聚合中 我们保留对另一个聚合根的引用 这对于整个应用程序非常重要 基于它们的 ID 因此不存在硬引用 删除
  • 如何在 PHP 5.6 中通过 php.ini 设置“verify_peer_name=false”SSL 上下文选项

    案例 我想打开 SSL 连接localhost而 SSL 证书是 FQDN 的问题 问题 没有进行特殊处理就行 下面的程序失败并显示以下消息 PHP Warning stream socket enable crypto Peer cert

随机推荐

  • VMware Esxi 8.0 直通Nvidia P40显卡

    目录 一 前言 二 错误信息 三 解决过程 一 前言 接到一个客户需求 xff0c 想在Esxi上直通Nvidia P40显卡 xff0c 直通后无法打开虚拟机 二 错误信息 下图是错误信息 xff0c 如图所示 xff0c 任务名称 打开
  • iOS 不规则瀑布流

    iOS 自从出了UICollectionview之后 界面的样式可谓更加的多元化 对于一些较为复杂的界面UICollectionview都可以相对轻松的实现 而且由于其 FlowLayout 子类的存在 界面的布局更可谓是随心所欲 下面就来
  • php7.4 docker 安装mongodb扩展

    Dockerfile 下面的pecl install mongodb的就是安装命令 FROM php 7 4 12 fpm RUN mv etc apt sources list etc apt sources list bak COPY
  • linux下wireshark安装和使用

    Wireshark是世界上最流行的网络分析工具 这个强大的工具可以捕捉网络中的数据 xff0c 并为用户提供关于网络和上层协议的各种信息 与很多其他网络工具一样 xff0c Wireshark也使用pcap network library来
  • HDU3700 Cat 恶心模拟题

    Problem Address xff1a http acm hdu edu cn showproblem php pid 61 3700 前言 终于又A了一道恶心的模拟题 看来HDU恶心题还是蛮多的 思路 扫描一遍 xff0c 如果有时间
  • Linux Docker最简单有效设置mysql 编码为utf8mb4解决乱码(三条命令解决)

    非常之简单高效 xff01 xff01 xff01 编辑my cnf span class token function vi span my cnf span class token comment 然后粘贴下面的并保存 span mys
  • 安利一款开源(3w star)的ssh、shell、cmd、sftp软件tabby(功能多、美观好用、支持插件)

    github地址 xff1a Tabby 官网 xff1a Tabby sh 用了之后非常之喜爱 xff0c 给作者点了个start xff0c 大家一起给这样的好开源软件点星星 自定义登录后脚本 对自己的配置可以设置快捷键快速打开一个该配
  • 远程控制ubuntu10.04

    由非linux平台连接到linux box有很多种方法 ubuntu本身就提供了XDMP VNC xff0c RDP等远程桌面登陆的方式 这些方式的实现比较简单 xff0c 没有使用多少数据压缩的技术 xff0c 因而远程时会感到比较慢 x
  • win10无线网卡共享网络给有线网卡再共享给其他电脑

    背景 xff1a 因项目主机为只有有线网卡的Linux系统 xff0c 需要联网安装一些程序 xff0c 需要win10的笔记本共享网络给项目主机 xff0c 但是调试环境下笔记本又只有连接手机热点的无线网络 xff0c 需要实现 笔记本无
  • 【解决错误】ModuleNotFoundError: No module named ‘PIL‘

    一 报错 Traceback span class token punctuation span most recent call last span class token punctuation span span class toke
  • 树莓派VNC配置教程

    VNC可以实现连接到树莓派后 xff0c 用电脑直接控制树莓派 xff0c 下面是VNC配置教程 xff1a 首先在电脑端上安装VNC xff08 官网下载地址 xff09 xff1a xff08 选择对应的版本 xff0c 下载安装即可
  • 用VSCode优雅的写MySQL

    一 SQL的部署 首先是部署MySQL xff0c 本地的MySQL在官网上下载包后 xff0c 按照默认的安装即可 xff0c 我使用的腾讯云的 云MySQL xff0c 可以到腾讯云官网租用 在租好数据库后 xff0c 进入控制台 xf
  • 机器学习笔记 五:逻辑回归(Logistics Regression)及两个分类案例

    目录 1 前言2 实现过程2 1 数据可视化过程2 2 Sigmoid函数2 3 代价函数 xff08 costFunction xff09 2 4 其他设置2 5 梯度下降函数2 5 1 梯度下降结果 xff08 初始参数为0 xff09
  • 器:ubnutu系统完美克隆至新硬盘,系统备份迁移至新硬盘(机器)

    一切皆为文件 xff0c 这个理念真酷 xff01 很好 xff01 ubuntu16 04 系统备份还原迁移至新机器 亲测可用 xff0c 刚刚克隆完毕 1 打包整个系统 xff1a sudo su cd tar czvpf sys ba
  • tools:nerd font debian(ubuntu maybe the same)

    i get garbled in my nerdtree try to fix this bug down load this by yourself bug nerdtree 显示图标乱码 CSDN博客 download font by
  • Ubuntu 设置环境变量问题总结

    一 动态链接库问题 最近一直被 error while loading shared libraies 错误困扰 xff0c 于是简单的总结了一下Ubuntu 环境变量的设置问题 从下面几个方面来说 xff1a 1 系统默认库 1 xff0
  • Python之配置日志的几种方式(logging模块)

    作为开发者 xff0c 我们可以通过以下3种方式来配置logging 1 xff09 使用Python代码显式的创建loggers handlers和formatters并分别调用它们的配置函数 xff1b 2 xff09 创建一个日志配置
  • 硬盘分区、挂载及Ubuntu系统安装

    Linux发行版按照打包方式划分主要包括Debian系 基于Dpkg Red Hat系 基于RPM Slackware系等 xff0c 其中Debian系 Red Hat系是我们所常见的 xff0c 前者包括Ubuntu Debian GN
  • Ubuntu安装cuDNN

    一 官网下载与自己CUDA版本匹配的安装包 cudnn xff08 版本号 xff09 tgz 二 安装cuDNN tar xzvf cudnn xff08 版本号 xff09 tgz cuda Tab sudo cp cuda inclu
  • MySQL配置SSL访问-WEB配置JDBC支持SSL

    WEB配置JDBC支持SSL Connector J 可以使用 SSL 加密 JDBC 驱动程序和服务器之间通信的所有数据 xff08 初始握手除外 xff09 启用连接加密会带来性能损失 xff0c 其严重程度取决于多种因素 xff0c