c 连接mysql8数据 执行mysql_real_connect 报错 SSL connection error: SSL_CTX_new failed

c 连接mysql8数据 执行mysql_real_connect 报错 SSL connection error: SSL_CTX_new failed

这里是初始化
mysql_library_init(0, NULL, NULL);
snprintf(ip, IP_LEN, "%s", info.ip);
snprintf(user, USER_LEN, "%s", info.user);
snprintf(pwd, PWD_LEN, "%s", info.pwd);
snprintf(dbname, DBNAME_LEN, "%s", info.dbname);
port = info.port;
MYSQL *conn = mysql_init(NULL);

这里是连连接数据库

if (mysql_real_connect(conn, ip, user, pwd, dbname, port, NULL, CLIENT_MULTI_STATEMENTS) == NULL)
   {
      __log("连接失败,原因:%s", mysql_error(conn));
      close();
      return -1;
   }

结果报错 SSL connection error: SSL_CTX_new failed

int res = mysql_library_init(0, NULL, NULL);
看一下这个初始化成功没
再检查一下conn是否为空

可能是由于MySQL 8.0版本中引入了TLSv1.2协议,而你的系统中没有安装TLSv1.2的库,导致无法连接MySQL 8.0的数据库。你可以尝试安装TLSv1.2的库,或者降低MySQL的版本,以解决这个问题。

MySQL 8.0 默认使用TLSv1.2连接方式,可能和c程序使用的TLS版本不兼容,可以尝试在mysql_real_connect函数调用中设置mysql_ssl_set函数,将TLS版本设置为1.2版本,同时确认下链接是否正确,以及端口号等

仅供参考:
报错信息“SSL connection error: SSL_CTX_new failed”表明与MySQL服务器的SSL连接有问题。

要解决此问题,您可以尝试以下步骤:

1.检查 MySQL 服务器上是否启用了 SSL。如果未启用 SSL,则需要将 MySQL 服务器配置为使用 SSL。

2.检查 SSL 证书是否有效且未过期。如果 SSL 证书已过期,您需要更新它。

3.检查MySQL服务器上是否正确安装了SSL证书。您可以通过使用 MySQL 命令行客户端连接到 MySQL 服务器并检查 SSL 证书是否可信来验证这一点。

4.检查客户端计算机上是否正确安装了 SSL 证书。您可以通过检查客户端操作系统是否信任 SSL 证书来验证这一点。

5.MYSQL_OPT_SSL_MODE尝试通过将带有值的选项MYSQL_SSL_DISABLE传递给 来禁用 SSL mysql_options()。这将允许您在没有 SSL 的情况下连接到 MySQL 服务器。如果您能够在没有 SSL 的情况下进行连接,则可以对 MySQL 服务器上的 SSL 配置进行故障排除。

我希望这些建议可以帮助您解决问题。

这个问题可能是因为MySQL客户端库未能找到正确的SSL证书导致的。这可能是由于未安装MySQL的SSL证书或未正确配置MySQL客户端库引起的。为了解决这个问题,可以尝试以下解决方案:

  1. 确认MySQL客户端库是否支持SSL连接 通过检查mysql_config输出的选项是否包含“--ssl”来确认MySQL客户端库是否支持SSL连接。
  2. 确认SSL证书是否正确安装 确认是否已经正确安装了MySQL的SSL证书,并且证书的路径被正确指定。可以使用以下命令来确认MySQL的SSL证书的路径: css
    mysql_config --ssl-certs
    
  3. 设置环境变量 设置MYSQL_HOME环境变量为MySQL的根目录,例如:/usr/local/mysql。 bash
    export MYSQL_HOME=/usr/local/mysql
    export LD_LIBRARY_PATH=$MYSQL_HOME/lib
    
  4. 编译时添加SSL选项 如果MySQL客户端库未编译时未包含SSL支持,可以尝试重新编译MySQL客户端库并在编译时添加SSL选项。
  5. 禁用SSL连接 如果以上方法都无法解决问题,可以尝试禁用SSL连接来连接MySQL。在连接MySQL时,将最后一个参数设置为0以禁用SSL连接。 sql
    if (mysql_real_connect(conn, ip, user, pwd, dbname, port, NULL, 0) == NULL)
    

希望这些解决方案对您有帮助。

我现在是在mysql my.cnf 增加了skip_ssl 就没有保存了,但这样总不太好,我在继续尝试其他的办法

可参考思路:
1、降级openssl版本(我懒得去降级)
2、关闭mysql的openssl连接方式:
在mysql的配置文件,一般是/ect/my.cnf中的【mysqld】模块进行设置,在此模块下加入skip_ssl:

这可能是由于MySQL 8.0中引入的新安全特性导致的,它需要客户端使用SSL连接服务器。你可以尝试在MySQL服务器上启用SSL,并在客户端上添加SSL连接参数,以解决此问题。此外,你还可以尝试在MySQL服务器上禁用SSL,以便客户端可以使用非SSL连接连接到服务器。

这个错误通常表示 SSL/TLS 加密连接出现问题。可能有以下一些原因:

1.没有正确的安装 SSL/TLS 加密库或证书
2.SSL/TLS 协议版本不兼容
3.SSL/TLS 配置不正确
4.SSL/TLS 加密握手失败
针对该错误,你可以尝试以下几种解决方法:

1.确保你的 MySQL 客户端和服务器支持相同的 SSL/TLS 协议版本。
2.确保 SSL/TLS 配置正确,包括证书文件、密钥文件等。
3.尝试禁用 SSL/TLS 加密,使用非加密连接,看看是否仍然出现问题。
4.确保正确地安装了 SSL/TLS 加密库,例如 OpenSSL。
你可以通过检查你的代码和 MySQL 服务器的日志,来更深入地了解这个问题的原因。

您的错误信息是 "SSL_CTX_new failed",这意味着 SSL 上下文创建失败。这通常是由于 SSL 相关的库或证书配置问题引起的。您可以尝试以下方法解决这个问题:

1 确认 MySQL 服务器已经正确地配置了 SSL,并且您的客户端已经加载了正确的 SSL 相关的库。

2 确认您的 SSL 相关的库是否支持 TLSv1.2 协议,因为 MySQL 8.x 默认只支持 TLSv1.2。

3 检查您的客户端是否加载了正确的证书文件。如果您使用的是自签名证书,请确保您的客户端已经加载了正确的 CA 证书文件。

4 确认您的客户端的 SSL 相关的库是否已经正确地初始化。您可以尝试在 mysql_init() 调用之前调用 SSL_library_init(),以确保 SSL 相关的库已经正确地初始化。

尝试以下代码:

mysql_library_init(0, NULL, NULL);
SSL_library_init(); // 添加此行

snprintf(ip, IP_LEN, "%s", info.ip);
snprintf(user, USER_LEN, "%s", info.user);
snprintf(pwd, PWD_LEN, "%s", info.pwd);
snprintf(dbname, DBNAME_LEN, "%s", info.dbname);
port = info.port;
MYSQL *conn = mysql_init(NULL);

if (mysql_real_connect(conn, ip, user, pwd, dbname, port, NULL, CLIENT_MULTI_STATEMENTS) == NULL)
{
    __log("连接失败,原因:%s", mysql_error(conn));
    close();
    return -1;
}

如果对您有帮助,请给与采纳,谢谢。

如果你使用的是MySQL 8,它默认启用了SSL/TLS加密,但是在连接时没有正确配置SSL,就会导致连接失败

根据错误提示 "SSL connection error: SSL_CTX_new failed",这可能是 SSL/TLS 的配置或证书问题。

MySQL 8 默认使用 SSL/TLS 加密通信,因此你需要为你的连接配置 SSL/TLS。以下是一些可能会导致这个错误的问题和解决方案:

1、确保你的 MySQL 8 数据库启用了 SSL/TLS 通信,你可以在 MySQL 8 的配置文件 my.cnf 中添加以下配置:

[mysqld]
ssl-ca=ca.pem
ssl-cert=server-cert.pem
ssl-key=server-key.pem

其中,ca.pem、server-cert.pem 和 server-key.pem 分别是你的 SSL/TLS 证书和密钥文件,你需要将它们放在 MySQL 8 的数据目录下。

2、如果你在连接时使用了 SSL/TLS,请确保你已经正确地配置了 SSL/TLS 证书和密钥,示例代码如下:

MYSQL *conn = mysql_init(NULL);
mysql_ssl_set(conn, "/path/to/client-key.pem", "/path/to/client-cert.pem", "/path/to/ca.pem", NULL, NULL);
if (mysql_real_connect(conn, ip, user, pwd, dbname, port, NULL, CLIENT_MULTI_STATEMENTS) == NULL) {
   __log("连接失败,原因:%s", mysql_error(conn));
   close();
   return -1;
}


其中,client-key.pem 和 client-cert.pem 分别是你的 SSL/TLS 客户端证书和密钥文件,ca.pem 是你的 SSL/TLS 证书文件。

3、如果你没有启用 SSL/TLS,可以尝试在 mysql_real_connect() 函数的最后一个参数中指定 0,以明确禁用 SSL/TLS:

if (mysql_real_connect(conn, ip, user, pwd, dbname, port, NULL, 0) == NULL) {
   __log("连接失败,原因:%s", mysql_error(conn));
   close();
   return -1;
}


如果你仍然无法解决问题,请检查你的 SSL/TLS 配置和证书文件是否正确,并根据需要更新它们。
引用gpt

该错误通常表示无法创建 SSL 上下文,这可能是由于以下原因之一造成的:

缺少 SSL 证书或密钥:请确保已正确配置 SSL 证书和密钥,并且它们是有效的。可以尝试重新安装或重新生成证书和密钥。

SSL 上下文配置错误:请检查 SSL 上下文配置是否正确,并尝试更改配置以解决问题。

SSL 库未正确安装或未正确配置:请检查 SSL 库是否正确安装和配置,并尝试重新安装或重新配置 SSL 库。

防火墙或安全软件阻止连接:请检查防火墙和安全软件的配置,确保允许连接 MySQL 服务器。

修改mysql配置


vi /etc/my.cnf
skip_ssl

:wq

systemctl restart mysqld

或者降低版本为mysql5.7

题主,这个问题我来替你解决,若有帮助,还望采纳,点击回答右侧采纳即可。

在连接语句后边加上SslMode = none;即可

string connectstr=“server=localhost;port=3306;database=test;uid=root;pwd=;SslMode = none;”;