GNU GCC程序在访问数据库时出错:SQL:TLS/SSL错误:需要SSL,但服务器不支持
我正在尝试创建一个连接到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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。