GNU GCC程序在访问数据库时出错:SQL:TLS/SSL错误:需要SSL,但服务器不支持

后端开发 2026-07-12

我正在尝试创建一个连接到MariaDB服务器的程序。若使用服务器自带的库,代码工作正常,但当我使用从MariaDB Connector C源代码编译得到的更新版本时,就会出现如下错误:

SQL:TLS/SSL错误:需要SSL,但服务器不支持它

我尝试禁用SSL/TLS,但错误仍然存在。

下面是我使用的代码

int Verify_ServerSQL(const char *Server_URL, const char *Server_DbName, const char *Server_UserName, const char *Server_Password, const char *Server_Prefix, const char *Server_Port, char *messageerror, int verifytest,int SSLConnection) {
    MYSQL *conn = mysql_init(NULL);

    if (!conn) {
        strcpy(messageerror, "Errore mysql_init()");
        return 0;
    }

    //verify if I use SSL 
    if (SSLConnection == 1) {
        mysql_ssl_set(conn, NULL, NULL, NULL, NULL, NULL);
        my_bool enforce = 1;
        mysql_options(conn, MYSQL_OPT_SSL_ENFORCE, &enforce);
        printf("SSL ON\n");
    } else {
        my_bool enforce = 0;
        mysql_options(conn, MYSQL_OPT_SSL_ENFORCE, &enforce);
        // Disattiva SSL
        mysql_ssl_set(conn, NULL, NULL, NULL, NULL, NULL);

        printf("SSL OFF\n");
    }




    unsigned int port = atoi(Server_Port);

    // Try connection


    if (!mysql_real_connect(
            conn,
            Server_URL,
            Server_UserName,
            Server_Password,
            NULL,        
            port,
            NULL,
            0
        )) {

        snprintf(messageerror, 512, "Errore connessione SQL: %s", mysql_error(conn));
        mysql_close(conn);
        return 0;
    }

    // If  verifytest == 1  Verify the table and database
    if (verifytest == 1) {

        // watch if database already exist
        char query[512];
        snprintf(query, sizeof(query),
                 "CREATE DATABASE IF NOT EXISTS `%s` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;",
                 Server_DbName);

        if (mysql_query(conn, query)) {
            snprintf(messageerror, 512, "Error creating database: %s", mysql_error(conn));
            mysql_close(conn);
            return 0;
        }

        // Selection database
        if (mysql_select_db(conn, Server_DbName)) {
            snprintf(messageerror, 512, "Error select database: %s", mysql_error(conn));
            mysql_close(conn);
            return 0;
        }

        // 2) verify or create if not exist the table
        char tablename[256];
        snprintf(tablename, sizeof(tablename), "%sgfstoremantestdb", Server_Prefix);

        snprintf(query, sizeof(query),
                 "CREATE TABLE IF NOT EXISTS `%s` ("
                 "id INT AUTO_INCREMENT PRIMARY KEY,"
                 "testo VARCHAR(255) NOT NULL"
                 ") ENGINE=InnoDB;",
                 tablename);

        if (mysql_query(conn, query)) {
            snprintf(messageerror, 512, "Error creating table: %s", mysql_error(conn));
            mysql_close(conn);
            return 0;
        }
    }

    // Connection OK
    strcpy(messageerror, "Connection OK");
    mysql_close(conn);
    return 1;
}

在研究过程中,我没有找到一个全面回答我问题的帖子。

这段代码必须在有SSL/TLS和没有SSL/TLS两种情形下都能工作。

解决方案

在你的代码中:禁用SSL(enforce=0),但不要控制证书验证行为。

最新版的MariaDB C连接器也包含用于SSL/TLS连接所需的代码。即使未强制SSL,如果服务器提供了SSL,仍可能对证书进行验证,可能导致与你遇到的错误类似的情况。

你必须添加:
mysql_options(conn, MYSQL_OPT_SSL_VERIFY_SERVER_CERT, &verify);

这行代码会告诉MySQL客户端:在连接时,是否验证(取决于verify的值)服务器证书的真实性。在你禁用SSL的代码中,这用于关闭证书验证,使连接在意外情况下也更具容错性。

尝试修改你这段代码的这部分。

你的代码:

    //verify if I use SSL 
    if (SSLConnection == 1) {
        mysql_ssl_set(conn, NULL, NULL, NULL, NULL, NULL);
        my_bool enforce = 1;
        mysql_options(conn, MYSQL_OPT_SSL_ENFORCE, &enforce);
        printf("SSL ON\n");
    } else {
        my_bool enforce = 0;
        mysql_options(conn, MYSQL_OPT_SSL_ENFORCE, &enforce);
        // Disattiva SSL
        mysql_ssl_set(conn, NULL, NULL, NULL, NULL, NULL);

        printf("SSL OFF\n");
    }

将代码升级为:

if (SSLConnection == 1) {
        mysql_ssl_set(conn, NULL, NULL, NULL, NULL, NULL);
        my_bool enforce = 1;
        mysql_options(conn, MYSQL_OPT_SSL_ENFORCE, &enforce);

    } else {
        my_bool enforce = 0;
        my_bool verify = 0;
        mysql_options(conn, MYSQL_OPT_SSL_ENFORCE, &enforce);
        mysql_options(conn, MYSQL_OPT_SSL_VERIFY_SERVER_CERT, &verify); /* Use this option for verify and disable TSL/SSL */

    }
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章