如何在QT中使用MYSQL SSL连接

1.在mysql服务器启动SSL连接

mysql> show variables like '%ssl%';
+---------------+----------------------------------+
| Variable_name | Value                            |
+---------------+----------------------------------+
| have_openssl  | YES                              |
| have_ssl      | YES                              |
| ssl_ca        | /etc/mysql/certs/ca-cert.pem     |
| ssl_capath    |                                  |
| ssl_cert      | /etc/mysql/certs/server-cert.pem |
| ssl_cipher    |                                  |
| ssl_key       | /etc/mysql/certs/server-key.pem  |
+---------------+----------------------------------+
7 rows in set (0.00 sec)


2.qt中启用SSL选项
很多人都说在QSqlDatabase::open()函数之前,调用mysql_ssl_set函数设置证书即可使用,外加QSqlDatabase::setConnectOptions("CLIENT_SSL=1;CLIENT_IGNORE_SPACE=1"); 我试了几次,没作用,为什么呢?
考虑到qt的MySQL有一个调用接口,我翻看了其源码(src/sql/drivers/mysql/qsql_mysql.cpp)看其中的open()实现

//显然这里使用mysql_init函数后,直接调用mysql_real_connect连接MySQL,也即没设置SSL连接证书,那怎么连接呢?
    if ((d->mysql = mysql_init((MYSQL*) 0))
 &&
            mysql_real_connect(d->mysql,
                               host.isNull() ? static_cast<const char *>(0)
                                             : host.toLocal8Bit().constData(),
                               user.isNull() ? static_cast<const char *>(0)
                                             : user.toLocal8Bit().constData(),
                               password.isNull() ? static_cast<const char *>(0)
                                                 : password.toLocal8Bit().constData(),
                               db.isNull() ? static_cast<const char *>(0)
                                           : db.toLocal8Bit().constData(),
                               (port > -1) ? port : 0,
                               unixSocket.isNull() ? static_cast<const char *>(0)
                                           : unixSocket.toLocal8Bit().constData(),
                               optionFlags))
    {
        if (!db.isEmpty() && mysql_select_db(d->mysql, db.toLocal8Bit().constData())) {
            setLastError(qMakeError(tr("Unable to open database '") + db +
                         QLatin1Char('\''), QSqlError::ConnectionError, d));
            mysql_close(d->mysql);
            setOpenError(true);
            return false;
        }
#if MYSQL_VERSION_ID >= 50000
        if(reconnect)
            mysql_options(d->mysql, MYSQL_OPT_RECONNECT, &reconnect);
#endif
    } else {
        setLastError(qMakeError(tr("Unable to connect"),
                     QSqlError::ConnectionError, d));
        mysql_close(d->mysql);
        d->mysql = NULL;
        setOpenError(true);
        return false;
    }
加上mysql_ssl_set试试

  d->mysql = mysql_init(NULL);
 mysql_ssl_set(d->mysql, "/etc/mysql/certs/client-key.pem", "/etc/mysql/certs/client-cert.pem", "/etc/mysql/certs/ca-cert.pem", NULL, NULL);
    if ( mysql_real_connect(d->mysql, "10.142.54.88","xxx","code","aaa",3306,"", 0))
...

其中三个文件是我的证书路径,经过如此更改,即可连接上
在这个过程中要注意一个问题
1)有些人把mysql直接编进qt内核中,而不是plugin;如果是这样的话,即使你重新编译qt中mysql的plugin,这个更改是无法生效的,自然也就连不上mysql
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在Qt使用SSL方式连接MySQL,需要进行以下步骤: 1. 安装MySQL驱动程序:在Qt使用MySQL需要安装MySQL驱动程序。你可以从Qt官方网站下载可用的驱动程序,也可以使用Qt提供的商业驱动程序。 2. 在Qt项目包含MySQL头文件:在Qt项目使用MySQL时,需要在代码包含MySQL头文件。 3. 建立SSL连接使用QSslSocket类在Qt建立SSL连接。在连接数据库之前,需要设置数据库驱动程序、数据库名称、用户名和密码等信息。 4. 执行SQL语句:一旦连接成功,就可以使用QSqlQuery类执行SQL语句。你可以使用该类执行SELECT、INSERT、UPDATE和DELETE等SQL语句。 下面是一些示例代码,演示如何在Qt使用SSL方式连接MySQL: ```c++ #include <QCoreApplication> #include <QtSql> #include <QSslSocket> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 设置MySQL驱动程序 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); db.setDatabaseName("mydatabase"); db.setUserName("myusername"); db.setPassword("mypassword"); // 开启SSL模式 QSslSocket sslSocket; db.setConnectOptions("MYSQL_OPT_SSL_VERIFY_SERVER_CERT"); db.setConnectOptions(QString("MYSQL_OPT_SSL_CA=\"/path/to/ca-cert.pem\"&MYSQL_OPT_SSL_CERT=\"/path/to/client-cert.pem\"&MYSQL_OPT_SSL_KEY=\"/path/to/client-key.pem\"")); // 打开数据库连接 if (!db.open()) { qDebug() << "Failed to connect to database!"; return 1; } // 执行SQL查询 QSqlQuery query; query.exec("SELECT * FROM mytable"); while (query.next()) { QString name = query.value(0).toString(); int age = query.value(1).toInt(); qDebug() << name << age; } // 关闭数据库连接 db.close(); return a.exec(); } ``` 这只是一个简单的示例,你可以根据自己的需要进行修改。需要注意的是,你需要将路径替换为你自己的证书路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值