• mysql数据库使用useSSL=true,并配置ca证书和密钥连接


    参考:Mysql5.7开启SSL并且支持Springboot客户端验证
    https://blog.csdn.net/weixin_42911645/article/details/127070812

    前提:已安装好数据库,这里以mysql5.7为例

    一、配置mysql服务器

    1. 确认数据库目录位置,可以输入以下指令查看:
    show variables like 'datadir';
    
    • 1

    在这里插入图片描述
    数据库安装好后,在数据库目录下存在默认生成好的证书文件:
    ca.pemca-key.pemclient-cert.pemclient-key.pemserver-cert.pemserver-key.pem
    如果没有以上文件,需要手工生成,-> 【制作证书】

    1. 修改mysql配置文件,添加ssl调用配置
    [client]
    ssl-cert = "C:/ProgramData/MySQL/MySQL Server 5.7/Data/client-cert.pem"
    ssl-key = "C:/ProgramData/MySQL/MySQL Server 5.7/Data/client-key.pem"
    注意:如果是做了主从,需要把主的证书拷贝到从
        
    [mysqld]
    ssl-ca="C:/ProgramData/MySQL/MySQL Server 5.7/Data/ca.pem"
    ssl-cert="C:/ProgramData/MySQL/MySQL Server 5.7/Data/server-cert.pem"
    ssl-key="C:/ProgramData/MySQL/MySQL Server 5.7/Data/server-key.pem"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 重启mysql服务,检查数据库ssl是否开启状态,have_openssl 与 have_ssl 值都为YES表示ssl开启成功
    show variables like '%ssl%';
    show variables like 'have%ssl%';
    
    • 1
    • 2
    1. 通过客户端密钥与证书ssl+密码连接测试,并查看属性
      指定证书文件位置client-cert.pemclient-key.pem
    mysql -uroot -proot -h 127.0.0.1 -P 13306 --ssl-cert=D:/server/config/client-cert.pem --ssl-key=D:/server/config/client-key.pem
    
    • 1

    要确定当前与服务器的连接是否使用加密,请检查Ssl_cipher状态变量的会话值 。如果该值为空,则连接未加密。否则,连接被加密并且该值指示加密密码。例如:

    mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher';
    
    +---------------+---------------------------+
    | Variable_name | Value                     |
    +---------------+---------------------------+
    | Ssl_cipher    | DHE-RSA-AES128-GCM-SHA256 |
    +---------------+---------------------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    对于mysql客户端,另一种方法是使用STATUSor\s 命令并检查该SSL行:

    # 1.未使用
    mysql> \s
    ...
    SSL: Not in use
    ...
     
     # 2.已使用
    mysql> \s
    ...
    SSL: Cipher in use is DHE-RSA-AES128-GCM-SHA256  
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    二、JAVA客户端连接数据库

    1. 找服务端提供三个原始文件
      在这里插入图片描述
      在原始文件目录下,依次执行以下指令,生成keystoremysqltruststoremysql 文件。
      可自行修改密码,默认是123456
    1. 生成truststore文件
    
    keytool -importcert -alias Cacert -file ca.pem -keystore truststoremysql -storepass 123456
    
    2. 生成中间文件
    
    openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -name "mysqlclient" -passout pass:123456 -out client-keystore.p12
    
    3. 生成keystore文件
    
    keytool -importkeystore -srckeystore client-keystore.p12 -srcstoretype pkcs12 -srcstorepass 123456 -destkeystore keystoremysql -deststoretype JKS -deststorepass 123456
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    以上两个文件生成的参数可以自己修改,windows环境中没有openssl,在linux环境中执行。密码注意自行更改为统一的值,后续配置要用到
    生成结果:
    在这里插入图片描述
    另:
    为了方便,已经将上述指令封装为脚本:
    在这里插入图片描述
    create.sh:

    #!/bin/bash
    
    passwd=$1
    outpath=$(pwd)/out
    echo "outpath: ${outpath}"
    
    if [ -z "$passwd" ];then
      echo '密码不能为空,使用示例:./create 123456'
      exit 0
    fi
    
    rm -rf $outpath
    if [ ! -d $outpath ];then
      mkdir $outpath
    fi
    
    
    
    echo '1【生成truststore文件...】'
    keytool -importcert -alias Cacert -file ca.pem -keystore ${outpath}/truststoremysql -storepass ${passwd}
    
    echo '2【生成中间文件...】'
    openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -name "mysqlclient" -passout pass:${passwd} -out ${outpath}/client-keystore.p12
    
    echo '3【生成keystore文件...】'
    keytool -importkeystore -srckeystore ${outpath}/client-keystore.p12 -srcstoretype pkcs12 -srcstorepass ${passwd} -destkeystore ${outpath}/keystoremysql -deststoretype JKS -deststorepass ${passwd}
    
    echo " "
    echo "=======文件生成成功======"
    echo "请拷贝目录${outpath}下的 truststoremysql 和 keystoremysql 文件"
    echo "========================="
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    1. 使用目标文件keystoremysqltruststoremysql和密码123456进行客户端链接
      以下为spring配置文件application.properties示例:
    # 目标文件目录(keystoremysql、truststoremysql)
    ssl.cert.path=C:\\Users\\cmc\\Desktop
    
    # 生成目标文件时填写的密码
    ssl.password=123456
    
    ssl.config=useSSL=true&verifyServerCertificate=true&requireSSL=true&clientCertificateKeyStoreUrl=file:${ssl.cert.path}/keystoremysql&clientCertificateKeyStorePassword=${ssl.password}&trustCertificateKeyStoreUrl=file:${ssl.cert.path}/truststoremysql&trustCertificateKeyStorePassword=${ssl.password}
    
    # datasource配置:
    spring.datasource.master.url=jdbc:mysql://127.0.0.1:13306/db1?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8&${ssl.config}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    【Edabit 算法 ★☆☆☆☆☆】Power Calculator
    hadoop-MapReduce
    Spring Security加密和匹配
    伪类选择器——点击文本时可以用于改变颜色以及注意事项和链接伪类在实际开发中的写法
    猿创征文|为了练习自己的Python基础语法,我用pygame写了一个打砖块闯关的游戏
    Naive UI 文档地址
    基于深度学习的物体材质预测
    若依微服务版的快速构建
    How about a push-type floor scrubber
    对象存储之:多版本
  • 原文地址:https://blog.csdn.net/u014438244/article/details/127699992