【日常总结】本地正常,docker 中报错:SQLNonTransientConnectionException: Could not create connection to database se

一、环境

二、场景

三、原因

四、解决方案

五、扩展

▶  5.1、什么是SSL

▶  5.2、MySQL 如何启用SSL

>  Stage 1、生成 SSL 证书和私钥

>  Stage 2、配置 MySQL 服务器

>  Stage 3、重启 MySQL 服务器

>  Stage 4、测试 SSL 连接

▶  5.3、MySQL 启用SSL,对应的客户端java程序的配置文件中的jdbc字符串如何写?

▶  5.4、verifyServerCertificate=true 是否需要做双向认证?


一、环境

开发环境windows + idea + Spring boot

服务器环境 1阿里云ECS + ubuntu 18 + docker + mysql 5.7.28

服务器环境 2阿里云ECS + ubuntu 18 + docker + mysql 8.0.30

二、场景

  • 本地IDEA开发,项目正常启动

  • docker中启动正常,接口文档能够正常访问

  • 调用接口(访问数据库)报错

java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.

三、原因

        数据库链接报错

 

四、解决方案

        连接数据库 useSSL=true 改成 useSSL=false 即可

spring:
  datasource:                                           # 数据源的相关配置
#    type: com.zaxxer.hikari.HikariDataSource          # 数据源类型:HikariCP
#    driver-class-name: com.mysql.cj.jdbc.Driver          # mysql驱动
    url: jdbc:mysql://${mysqlhost}:${mysqlport}/xph?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&keepAlive=true&autoReconnect=true&autoReconnectForPools=true
    username: root
    password: ${mysql-password}
    hikari:
      connection-timeout: 30000       # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 默认:30秒
      minimum-idle: 5                 # 最小连接数
      maximum-pool-size: 20           # 最大连接数
      auto-commit: true               # 自动提交
      idle-timeout: 600000            # 连接超时的最大时长(毫秒),超时则被释放(retired),默认:10分钟
      pool-name: DateSourceHikariCP   # 连接池名字
      max-lifetime: 1800000           # 连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认:30分钟 1800000ms
      connection-test-query: SELECT 1 # 连接时测试语句
  servlet:
    multipart:
      max-file-size: 512000     # 文件上传大小限制为500kb
      max-request-size: 512000  # 请求大小限制为500kb

五、扩展

▶  5.1、什么是SSL

SSL(Secure Socket Layer)安全套接层是Netscape公司率先采用的网络安全协议。它是在传输通信协议(TCP/IP)上实现的一种安全协议,采用公开密钥技术。SSL广泛支持各种类型的网络,同时提供三种基本的安全服务,它们都使用公开密钥技术。

 

▶  5.2、MySQL 如何启用SSL

要启用 MySQL 的 SSL 功能,需要进行以下步骤:

>  Stage 1、生成 SSL 证书和私钥

使用 OpenSSL 工具生成 SSL 证书和私钥。可以使用以下命令:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/mysql/mysql-server.key -out /etc/mysql/mysql-server.crt

其中

  • /etc/mysql/mysql-server.key 是私钥文件路径

  • /etc/mysql/mysql-server.crt 是证书文件路径

 

>  Stage 2、配置 MySQL 服务器

在 MySQL 服务器配置文件(通常是 /etc/mysql/my.cnf)中添加以下行:

[mysqld]
ssl-ca=/etc/mysql/mysql-server.crt
ssl-cert=/etc/mysql/mysql-server.crt
ssl-key=/etc/mysql/mysql-server.key

        这将告诉 MySQL 服务器使用上面生成的证书和私钥。

>  Stage 3、重启 MySQL 服务器

重启 MySQL 服务器以使更改生效:

sudo systemctl restart mysql

 

>  Stage 4、测试 SSL 连接

使用以下命令测试 SSL 连接:

mysql -u root -p --ssl-ca=/etc/mysql/mysql-server.crt --ssl-cert=/etc/mysql/mysql-server.crt --ssl-key=/etc/mysql/mysql-server.key

        这将使用 SSL 连接到 MySQL 服务器。如果连接成功,则表示 SSL 已经启用。

 

▶  5.3、MySQL 启用SSL,对应的客户端java程序的配置文件中的jdbc字符串如何写?

启用SSL的MySQL连接字符串应该包含以下属性:

  • useSSL=true:启用SSL连接

  • requireSSL=true:要求使用SSL连接

  • verifyServerCertificate=true:验证服务器证书

  • trustCertificate=<path_to_trusted_cert>:指定信任的证书路径

因此,一个典型的MySQL连接字符串应该如下所示:

jdbc:mysql://<hostname>:<port>/<database>?useSSL=true&requireSSL=true&verifyServerCertificate=true&trustCertificate=<path_to_trusted_cert>
  • 其中,<hostname> 是 MySQL 服务器的主机名,<port> 是 MySQL 服务器的端口号,<database> 是要连接的数据库名称,<path_to_trusted_cert> 是信任的证书路径。

▶  5.4、verifyServerCertificate=true 是否需要做双向认证?

verifyServerCertificate=true 选项只是告诉 MySQL 客户端在建立 SSL 连接时验证服务器证书的有效性。它并不需要进行双向认证,也就是说,MySQL 客户端不需要提供自己的证书进行验证。

如果需要进行双向认证,需要在 MySQL 服务器端启用 SSL,并配置客户端证书验证。此时,需要在 MySQL 连接字符串中添加 clientCertificateKeyStoreUrlclientCertificateKeyStorePasswordtrustCertificateKeyStoreUrltrustCertificateKeyStorePassword 等选项来指定客户端证书和信任证书的路径和密码。例如:

jdbc:mysql://<hostname>:<port>/<database>?useSSL=true&clientCertificateKeyStoreUrl=<path_to_client_keystore>&clientCertificateKeyStorePassword=<client_keystore_password>&trustCertificateKeyStoreUrl=<path_to_truststore>&trustCertificateKeyStorePassword=<truststore_password>

其中,<path_to_client_keystore> 是客户端证书的路径,<client_keystore_password> 是客户端证书的密码,<path_to_truststore> 是信任证书的路径,<truststore_password> 是信任证书的密码。同时,MySQL 服务器端也需要配置对应的证书和密钥。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>