gpt4 book ai didi

c++ - 使用 boost asio 和 SSL 时消息过大

转载 作者:行者123 更新时间:2023-11-30 02:48:02 24 4
gpt4 key购买 nike

我目前正在使用 SSL 来保护传输的服务器。接受连接后,服务器进行 hadshake,如果成功,则向客户端发送一个数据包。

我的代码在 Windows 上运行得非常好,但是当我在 Debian 7 上运行它时,当我尝试写入该数据包时出现“消息大小过大”错误。

我很确定它不是来 self 的证书,因为我尝试使用相同的证书运行 boost asio SSL 示例并且它工作得很好。

代码如下:

服务器初始化:

Server::Server(configuration::Configuration const & conf, utils::Logger & log): _cmds(conf, log), _conf(conf), _logger(log), _ctx(boost::asio::ssl::context::sslv23)
{
tcp::endpoint endpoint(tcp::v4(), conf.getPort());
configuration::SSL_conf ssl = conf.getSLLInfos();

try
{
this->_ctx.set_options(boost::asio::ssl::context::default_workarounds
| boost::asio::ssl::context::no_sslv2
| boost::asio::ssl::context::single_dh_use);
this->_ctx.set_password_callback(boost::bind(&Server::_getPass, this, _1, _2));
this->_ctx.use_certificate_file(ssl.certificate.string(), boost::asio::ssl::context_base::pem);
this->_ctx.use_private_key_file(ssl.key.string(), boost::asio::ssl::context_base::pem);
this->_ctx.use_tmp_dh_file(ssl.certificate.string());
this->_acceptor.reset(new tcp::acceptor(this->_service, endpoint));
this->_logger.logMsg(3, "Starting listen on port " + std::to_string(endpoint.port()));
for (int i = 0; i < 256; ++i)
this->_c.push_back(std::shared_ptr<Client>(new Client(this->_service, this->_cmds, conf, log, i, this->_ctx)));
this->_acceptor->async_accept(this->_c.front()->getSocket(),
boost::bind(&Server::_handleAccept, this,
this->_c.front(),
boost::asio::placeholders::error));
}
catch (boost::system::system_error & err)
{
this->_logger.logErr(err.what());
}
}

session 的初始化:

void                    Client::init()
{
this->_logger.logMsg(3, "Client [" + std::to_string(this->_id) + "] initialized");
this->_isAlive = true;
this->_socket.async_handshake(boost::asio::ssl::stream_base::server,
boost::bind(&Client::handleHandshake, this,
boost::asio::placeholders::error));
}

握手回调:

void                    Client::handleHandshake(boost::system::error_code const & err)
{
if (!err)
{
memset(&this->_header, 0, sizeof(protocol::header));
this->_keepAlive = this->_conf.getKeepAlive();
this->_header.keepAlive = 1;
this->_logger.logStruct<protocol::header>("Client [" + std::to_string(this->_id) + "] Sending handhsake: ", this->_header);
boost::asio::async_write(this->_socket, boost::asio::buffer(&this->_header, sizeof(protocol::header)),
boost::bind(&Client::handleWrite, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
else
this->kill();
}

最后,我收到错误的写入回调:

void                    Client::handleWrite(boost::system::error_code const & err, std::size_t)
{
if (!err && this->_keepAlive)
{
clearBuff(this->_outBuff);
boost::asio::async_read(this->_socket, boost::asio::buffer(&this->_header, sizeof(protocol::header)),
boost::bind(&Client::handleHeaderRead, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
else
{
this->_logger.logErr("Client [" + std::to_string(this->_id) + "] write failed : " + err.message());
this->kill();
}
}

正如我所说,handleWrite 回调收到一个值为“Excessive message size”的错误。我真的不明白为什么我对 boost asio 的使用非常标准,而我的证书是自签名的,可以与其他应用程序一起使用。

感谢您的帮助。

最佳答案

尝试配置特定的 SSL 协议(protocol)版本(例如仅 SSLv3)。这减少了要发送的项目列表。

此外,考虑发送一个最小化的证书包(在服务器上的证书文件中),因为客户端不会对链中的大多数根证书感兴趣,除非它已经知道它们

关于c++ - 使用 boost asio 和 SSL 时消息过大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22285733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com