在windows下使用drogon_ctl create model models生成mysql数据库模型类报SSL错误 #BUG
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下执行同样的命令,连接同一个数据库,就能正常执行。
我使用的是windows版drogon框架,使用vcpkg进行安装的。 数据库是直接默认安装的,使用navicat可以正常连接。但是使用drogon框架连接时就会报 TLS/SSL证书错误。
如果你是内网环境或者本机连接测试,可以先关闭ssl:
[mysqld]
ssl=0
这个问题等我有时间在本地环境复现出来才好排查,抱歉对你造成困扰。
如果你是内网环境或者本机连接测试,可以先关闭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依然报错误,错误内容和上面相同。
我解决了这个问题,我的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;
}
}
}