首页 > 数据库 >java通过ssl连接mysql(linux)

java通过ssl连接mysql(linux)

时间:2023-10-31 10:49:05浏览次数:47  
标签:java pem ca 05 ssl mysql root Oct

环境:
Os:centos 7
mysql:5.7.29
java运行客户端:windows10

 

1.查看服务器的证书文件
mysql数据data目录下

[root@localhost data]# pwd
/opt/mysql57/data
[root@localhost data]# ls -al *.pem
-rw-------. 1 mysql mysql 1676 Oct 30 05:22 ca-key.pem
-rw-r--r--. 1 mysql mysql 1112 Oct 30 05:22 ca.pem
-rw-r--r--. 1 mysql mysql 1112 Oct 30 05:22 client-cert.pem
-rw-------. 1 mysql mysql 1676 Oct 30 05:22 client-key.pem
-rw-------. 1 mysql mysql 1676 Oct 30 05:22 private_key.pem
-rw-r--r--. 1 mysql mysql  452 Oct 30 05:22 public_key.pem
-rw-r--r--. 1 mysql mysql 1112 Oct 30 05:22 server-cert.pem
-rw-------. 1 mysql mysql 1680 Oct 30 05:22 server-key.pem

我们只需要如下3个文件
ca.pem
client-cert.pem
client-key.pem

keytool只需要ca.pem,其他工具如navicat这三个文件都需要,我们把这三个文件拷贝到临时目录.

[root@localhost /]# mkdir -p /tmp/ca
[root@localhost data]# cp ca.pem /tmp/ca/
[root@localhost data]# cp client-cert.pem /tmp/ca/
[root@localhost data]# cp client-key.pem /tmp/ca/

 

2.生成证书(前提需要安装好jdk,keytool是jdk自带的)

[root@localhost ca]# keytool -importcert -alias MySQLCACert -file ca.pem -keystore truststore -storepass 123456
Owner: CN=MySQL_Server_5.7.29_Auto_Generated_CA_Certificate
Issuer: CN=MySQL_Server_5.7.29_Auto_Generated_CA_Certificate
Serial number: 1
Valid from: Mon Oct 30 05:22:31 EDT 2023 until: Thu Oct 27 05:22:31 EDT 2033
Certificate fingerprints:
         SHA1: F9:70:21:7F:D7:B6:86:86:7A:F7:98:37:07:C8:81:C2:9D:0A:F7:50
         SHA256: 98:05:FF:3B:B7:E1:EE:F9:3C:60:65:32:3C:58:04:6D:1B:97:58:FC:D2:D3:B2:57:B4:25:B9:ED:AD:9C:67:88
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3

Extensions: 

#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
  CA:true
  PathLen:2147483647
]

Trust this certificate? [no]:  y
Certificate was added to keystore

 

这个时候可以看到生成了truststore文件

[root@localhost ca]# ls -al
total 20
drwxr-xr-x.  2 root root   83 Oct 30 21:45 .
drwxrwxrwt. 21 root root 4096 Oct 30 21:40 ..
-rw-r--r--.  1 root root 1112 Oct 30 05:56 ca.pem
-rw-r--r--.  1 root root 1112 Oct 30 05:56 client-cert.pem
-rw-------.  1 root root 1676 Oct 30 05:56 client-key.pem
-rw-r--r--.  1 root root  846 Oct 30 21:45 truststore

同时也解压可以看到这里该证书的有效期是10年
Valid from: Mon Oct 30 05:22:31 EDT 2023 until: Thu Oct 27 05:22:31 EDT 2033

这里设置的密码是123456,后面的jdbc连接需要用到这个密码

 

3.成之后可以查看一下是否生成成功,操作命令

[root@localhost ca]# keytool -list -keystore truststore
Enter keystore password:  
Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

mysqlcacert, Oct 30, 2023, trustedCertEntry, 
Certificate fingerprint (SHA-256): 98:05:FF:3B:B7:E1:EE:F9:3C:60:65:32:3C:58:04:6D:1B:97:58:FC:D2:D3:B2:57:B4:25:B9:ED:AD:9C:67:88

 

4.把该truststore文件下载到客户端
我这里下载放在如下目录:
C:\linux_ca

 

5.mysql服务器器创建ssl用户和相应的数据库

mysql> grant all privileges on *.* to 'ssltest'@'%' identified by 'mysql' require ssl;
Query OK, 0 rows affected, 1 warning (0.05 sec)

mysql> create database db_test;
Query OK, 1 row affected (0.04 sec)

 

6.Java程序连接验证

package ssltest;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;


public class mytest_linux {

    Connection con;
    public static String user;
    public static String password;

    public void getConnection() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("数据库驱动加载成功");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        user = "ssltest";
        password = "mysql";  // 填自己的密码
        try {
            //con = DriverManager.getConnection("jdbc:mysql://192.168.1.105:13306/db_test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=true", user, password);

            con = DriverManager.getConnection("jdbc:mysql://192.168.1.108:13306/db_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&verifyServerCertificate=true&requireSSL=true&sslMode=verify_ca&trustCertificateKeyStoreUrl=file:C:/linux_ca/truststore&trustCertificateKeyStorePassword=123456", user, password);
            
            
            System.out.println("数据库连接成功");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        mytest_linux c = new mytest_linux();
        c.getConnection();
    }
}

 

 

说明:
1.在linux服务器上生成truststore文件或是在客户端使用ca.pem生成的truststore文件,java程序都可以连接.

 

标签:java,pem,ca,05,ssl,mysql,root,Oct
From: https://www.cnblogs.com/hxlasky/p/17799721.html

相关文章

  • java怎么递归
    在Java中,递归(Recursion)是指一个方法在其内部调用自身的过程。递归通常用于解决可以被分解成相似子问题的问题。在编写递归函数时,需要定义递归的结束条件,以防止无限循环。下面是一个简单的递归示例,演示了如何使用递归计算一个数的阶乘:publicclassMain{publicstaticvoi......
  • Java配置工具:typesafe config使用文档超详解
    文章目录一、typesafeconfig概述1、官网2、优点3、JSON超集特性(HOCON)(1)实例4、版本概述二、typesafeconfig基本使用1、API示例2、更多示例3、不变性4、模式和验证5、配置文件加载6、合并配置树7、处理默认值8、理解Config和ConfigObject9、理解ConfigFactory一、typesafeconfig......
  • 明解Java第二章练习题答案
    练习2-1请对代码清单2-6的2处进行修改,将带有小数部分的实数值赋给x和y,查看结果如何?答案:编译器会报错,因为小数的默认类型double是比int更大的类型。如果给double类型的变量赋值整数,则编译器不会报错。练习2-2请编写一段程序,对三个int型变量进行赋值,并计算合计值和平均值。......
  • java 上传大文件
    Java上传大文件实现方法简介在开发过程中,我们经常会遇到需要上传大文件的需求。本文将教会你如何用Java实现上传大文件的功能。整体流程首先,让我们来看一下实现上传大文件的整体流程。下面是一个流程表格:步骤 描述1 创建一个文件上传表单2 在后端编写一个接收上传文件的控制器3 ......
  • MySQL中,当update修改数据与原数据相同时会再次执行吗?
    一、背景本文主要测试MySQL执行update语句时,针对与原数据(即未修改)相同的update语句会在MySQL内部重新执行吗?二、测试环境MySQL5.7.25Centos7.4三、binlog_format为ROW1、参数 2、测试步骤session1session2session13、总结在binlog_format=row和binlog_row_image......
  • JAVA-EE手写ThreadLocal源码实现一个线程一个连接对象------Java-Web项目
    手写ThreadLocalpackagecom.bjpowernode.ThreadLocal;importjava.util.HashMap;importjava.util.Map;publicclassMyThreadLocal<T>{privateMap<Thread,T>map=newHashMap<>();publicvoidset(To){//向threadLocal中绑定......
  • 【转载】Mysql8授予某个用户某个数据库的权限
    参考chatgpt3.5环境软件/系统版本说明mysql8.0.28正文要在MySQL中授予某个用户对某个数据库的权限,你可以使用以下SQL语句:GRANT权限列表ON数据库名.表名TO'用户名'@'主机名';下面是这个语句的各个部分的解释:权限列表:这是你要授予用户的权限列表,可......
  • 我应该在MySQL中使用datetime还是timestamp数据类型?
    内容来自DOChttps://q.houxu6.top/?s=我应该在MySQL中使用datetime还是timestamp数据类型?你推荐使用datetime还是timestamp字段,为什么(使用MySQL)?我正在服务器端使用PHP。在MySQL中,时间戳通常用于跟踪记录的更改,并且每次更改记录时通常都会更新。如果您想存储特定值,则应使用......
  • Solution to OpenSSL Connection Problems With Github
    ProblemsUploadingFileswithGitSometimeswecanusegittooltosuccessfullyuploadprojectstoGithub,butinothertimeespeciallyafteraperiodofconfiguration,weoftenmeetthefollowingerror:OpenSSLSSL_read:Connectionwasreset,error10054......
  • Java 基础篇day03
    流程控制分支结构if和switchif分支根据条件(真或假)来决定执行某段代码点击查看代码if(条件表达式){代码}if(条件表达式){代码1;}else{代码2;}if(条件表达式1){代码1;}elseif(条件表达式2){代码2;}...else{代码n;}switch分支点击查看代码switch(条件......