drogon icon indicating copy to clipboard operation
drogon copied to clipboard

在windows下使用drogon_ctl create model models生成mysql数据库模型类报SSL错误 #BUG

Open mrclassfree opened this issue 9 months ago • 4 comments

drogon_ctl create model models Create model mysql Connect to server... Source files in the models folder will be overwritten, continue(y/n)? 20250520 02:01:36.743000 UTC 5676 ERROR Error(2026) "TLS/SSL error: Server certificate validation failed. A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider. Error 0x800B0109(CERT_E_UNTRUSTEDROOT)" - MysqlConnection.cc:333 20250520 02:01:36.743000 UTC 5676 ERROR Failed to mysql_real_connect() - MysqlConnection.cc:335

但是我在linux下执行同样的命令,连接同一个数据库,就能正常执行。

mrclassfree avatar May 20 '25 02:05 mrclassfree

我使用的是windows版drogon框架,使用vcpkg进行安装的。 数据库是直接默认安装的,使用navicat可以正常连接。但是使用drogon框架连接时就会报 TLS/SSL证书错误。

mrclassfree avatar May 23 '25 06:05 mrclassfree

如果你是内网环境或者本机连接测试,可以先关闭ssl:

[mysqld]
ssl=0

这个问题等我有时间在本地环境复现出来才好排查,抱歉对你造成困扰。

an-tao avatar May 23 '25 06:05 an-tao

如果你是内网环境或者本机连接测试,可以先关闭ssl:

[mysqld]
ssl=0

这个问题等我有时间在本地环境复现出来才好排查,抱歉对你造成困扰。

你好,我试过了通过配置 [mysqld] ssl=0 之后,重启mysql, 然后使用drogon_ctl create model models 出现以下提示: 20250627 04:34:38.009000 UTC 12520 ERROR Error(2013) "Lost connection to server during query" - MysqlConnection.cc:333 20250627 04:34:38.009000 UTC 12520 ERROR Failed to mysql_real_connect() - MysqlConnection.cc:335

补充一点: 1、我是使用vcpkg在win11中安装的 drogon 1.9.10版本。 2、 mysql组件使用vcpkg安装的 libmariadb:x64-windows 3.4.1。 3、我尝试更新libmariadb版本到最新的3.4.6, git最新的drogon1.9.11版本,然后在windows中编译后使用drogon_ctl create model依然报错误,错误内容和上面相同。

mrclassfree avatar Jun 27 '25 04:06 mrclassfree

我解决了这个问题,我的mysql数据是8.4版本,这个版本对安全机制有更新,在服务端几乎无法停用SSL。vcpkg install有一个--editable选项,把buildtrees\drogon\src\v1.9.11-2720b59428文件夹的orm_lib\src\mysql_impl的MysqlConnection.cc文件修改一下,再vcpkg remove --purge drogon后,进行vcpkg install drogon[ctl,orm,mysql] --editable就行;此外,mysql_ssl_set将所有参数设置为nullptr并不能解决问题。

MysqlConnection::MysqlConnection(trantor::EventLoop *loop,
                                 const std::string &connInfo)
    : DbConnection(loop),
      mysqlPtr_(std::shared_ptr<MYSQL>(new MYSQL, [](MYSQL *p) {
          mysql_close(p);
          delete p;
      }))
{
    static MysqlEnv env;
    static thread_local MysqlThreadEnv threadEnv;
    mysql_init(mysqlPtr_.get());
    mysql_options(mysqlPtr_.get(), MYSQL_OPT_NONBLOCK, nullptr);
    mysql_ssl_set(mysqlPtr_.get(), nullptr, nullptr, nullptr, nullptr, nullptr);
    my_bool verify = 0;
    mysql_options(mysqlPtr_.get(), MYSQL_OPT_SSL_VERIFY_SERVER_CERT, (void *)&verify);
    mysql_options(mysqlPtr_.get(), MYSQL_OPT_SSL_ENFORCE, (void *)&verify);
#ifdef HAS_MYSQL_OPTIONSV
    mysql_optionsv(mysqlPtr_.get(), MYSQL_OPT_RECONNECT, &reconnect_);
#endif
    // Get the key and value
    auto connParams = parseConnString(connInfo);
    for (auto const &kv : connParams)
    {
        auto key = kv.first;
        auto value = kv.second;

        std::transform(key.begin(),
                       key.end(),
                       key.begin(),
                       [](unsigned char c) { return tolower(c); });
        // LOG_TRACE << key << "=" << value;
        if (key == "host")
        {
            host_ = value;
        }
        else if (key == "user")
        {
            user_ = value;
        }
        else if (key == "dbname")
        {
            // LOG_DEBUG << "database:[" << value << "]";
            dbname_ = value;
        }
        else if (key == "port")
        {
            port_ = value;
        }
        else if (key == "password")
        {
            passwd_ = value;
        }
        else if (key == "client_encoding")
        {
            characterSet_ = value;
        }
    }
}

linjiahao962889027 avatar Sep 14 '25 03:09 linjiahao962889027