我正在尝试使用SSL支持构建mysql-5.0.33客户端库。我正在使用
./configure --prefix=<some dir> --exec-prefix=<some dir> --with-openssl=<path to openssl dir> --without-server`
配置,然后make
和make install
链接的OpenSSL版本是1.0.0a。上述过程没有问题或错误。
现在我的程序如下
#include <mysql.h>
#include <stdio.h>
int main() {
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
char *server = "192.168.1.62";
char *user = "testssl";
char *password = "testssl"; /* set me first */
char *database = "mysql";
int port = 3321;
conn = mysql_init(NULL);
mysql_ssl_set(conn, "client-key.pem", "client-cert.pem", "ca-cert.pem", NULL, "DHE-RSA-AES256-SHA");
mysql_options(conn, MYSQL_OPT_CONNECT_TIMEOUT, "30");
/* Connect to database */
if (!mysql_real_connect(conn, server,
user, password, database, port, NULL, 0)) {
fprintf(stderr, "Real connect: %d: %s\n", mysql_errno(conn), mysql_error(conn));
return 1;
}
printf("SSL cipher used: %s \n", mysql_get_ssl_cipher(conn));
/* send SQL query */
if (mysql_query(conn, "show tables;")) {
fprintf(stderr, "\nQuery: %s\n", mysql_error(conn));
return 1;
}
res = mysql_use_result(conn);
/* output table name */
printf("Results:\n");
while ((row = mysql_fetch_row(res)) != NULL)
printf("%s \n", row[0]);
/* close connection */
mysql_free_result(res);
mysql_close(conn);
return 0;
}
该程序的构建如下:
gcc -o mysql-ssl-test -I <some dir>/include/mysql/ mysql-ssl-test.c -L <some dir>/lib/mysql/ -lmysqlclient -lpthread -lz -lm -lrt -lssl -lcrypto -ldl`
我连接的mysql服务器(192.168.1.62)已启用ssl,而用户testssl只能通过ssl连接(GRANT ... REQUIRE SSL
)。使用mysql命令行或其他类似Sqlyog的mysql客户端连接服务器没问题。
现在我收到错误Real connect: 2026: SSL connection error
,当我尝试使用此命令LD_LIBRARY_PATH=<some dir>/lib/mysql/ ./mysql-ssl-test
运行程序时,但是当使用此命令./mysql-ssl-test
运行时它运行正常(这里它试图链接到系统libmysqlclient,即v5.5.25和OpenSSL 1.0.0-fips)
有趣的是,如果我更换线
mysql_ssl_set(conn, "client-key.pem", "client-cert.pem", "ca-cert.pem", NULL, "DHE-RSA-AES256-SHA");`
带
mysql_ssl_set(conn, "client-key.pem", "client-cert.pem", "ca-cert.pem", NULL, NULL);`
即使使用LD_LIBRARY_PATH=<some dir>/lib/mysql/ ./mysql-ssl-test
也能正常运行。
这是我遇到的mysql 5.0.33或OpenSSL 1.0.0a的错误(谷歌搜索这样的错误没有帮助)或者我在构建libmysqlclient时犯了一些错误。
答案 0 :(得分:0)
修正:这是MySQL 5.0.33中的某种错误。通过升级到5.0.86来修复。