如何修改boost::asio::ssl::context的方法
how to change the method of boost::asio::ssl::context
我正在为第三方客户端应用程序编写一个https服务器。我使用pion c++网络库来实现服务器,
棘手的事情是:客户端使用sslv2,但pion使用sslv23作为上下文方法。这是构造函数:server::server(...)
: .....
m_ssl_context(m_active_scheduler.get_io_service(),
boost::asio::ssl::context::sslv23), // <--- not configurable
....
{}
我知道sslv2有安全问题,所以pion使用sslv23作为默认值,但客户端只使用sslv2。使用sslv23,服务器在握手期间报错"未知协议"。
我不想修改pion源使其只支持sslv2。我可以得到底层的ssl::context对象,我如何修改它来支持sslv2?
我查看了boost/asio/ssl/impl/context。ipp, ssl::context是noncopyable,不能使用辅助函数。
任何想法?
谢谢。
UPDATE_1 :
这里有一些测试
测试1:
我修改了pion源代码并重新编译了它,只是注释掉了no_sslv2行
m_ssl_context.set_options(
boost::asio::ssl::context::default_workarounds
//| boost::asio::ssl::context::no_sslv2 <------ remove this
| boost::asio::ssl::context::single_dh_use);
并使用sslv23(在构造函数中有四个sslv23)
server::server(...)
: .....
m_ssl_context(m_active_scheduler.get_io_service(),
boost::asio::ssl::context::sslv23), // left it as sslv23
....
{}
它不工作,boost error_code.message():
peer error no cipher
测试2 :
如果我不碰no_sslv2
m_ssl_context.set_options(
boost::asio::ssl::context::default_workarounds
| boost::asio::ssl::context::no_sslv2 <------
| boost::asio::ssl::context::single_dh_use);
并将四个sslv23更改为sslv2
server::server(...)
: .....
m_ssl_context(m_active_scheduler.get_io_service(),
boost::asio::ssl::context::sslv2), // change from sslv23 to sslv2
....
{}
则工作正常。我想这是sslv23方法的构造函数,实际上很重要。在上下文的构造函数中:
context::context(context::method m)
: handle_(0)
{
switch (m)
{
...
case context::sslv2:
handle_ = ::SSL_CTX_new(::SSLv2_method());
break;
...
case context::sslv23:
handle_ = ::SSL_CTX_new(::SSLv23_method());
break;
}
....
}
SSLv23_method与SSLv2_method不兼容?
我认为客户端使用sslv2,因为我用openssl测试了它:
测试3:
openssl s_server -accept 443 -key server.pem -cert server.pem -ssl2
这使得openssl作为服务器,然后连接客户端到它,它工作得很好。根据openssl的文档,后面的-ssl2强制它使用sslv2。-ssl3和-tls1都不能工作,openssl说:"错误的版本号"
UPDATE_2
我试过这个,似乎也工作,不知道它是否会导致内存泄漏。
SSL_CTX_set_ssl_version( // use the native handle
m_server_443->get_ssl_context_type().native_handle(), ::SSLv2_method()
);
您的问题不在于您所展示的m_ssl_context
的构造。ssl::context::sslv23
的规范意味着您的服务器接受SSLv2或更高版本来开始协商安全连接。禁止SSLv2的限制在同一文件中,但在此之后:
m_ssl_context.set_options(boost::asio::ssl::context::default_workarounds
| boost::asio::ssl::context::no_sslv2
| boost::asio::ssl::context::single_dh_use);
这是ssl::context::no_sslv2
选项拒绝SSLv2连接。
你可以这样重置这些选项:
SSL_CTX_clear_options(m_server->get_ssl_context_type().native_handle(), SSL_OP_NO_SSLv2)
SSL_CTX_set_cipher_list(m_server->get_ssl_context_type().native_handle(), "TLSv1:SSLv3:SSLv2");
这两行使用底层OpenSSL API(1)清除set_ssl_key_file()
成员函数中设置的no_sslv2
选项,(2)确保启用SSLv2密码。使用set_options()
成员函数不起作用,因为它不能清除先前设置的选项,因此必须使用OpenSSL API函数SSL_CTX_clear_options()
。
很奇怪,你有一个客户端只使用SSLv2,因为这个协议已经被弃用了很长时间(近20年!)。
- 提升 Asio SSL 无法第二次接收数据(第一次确定)
- C++ 关闭Boost ASIO SSL套接字的最佳方法是什么?
- 使用 asio+ssl,async_write不会发送数据
- 提升 ASIO SSL 写入部分数据
- 用于 asio SSL 上下文的单个证书
- 为什么没有asio::ssl::iostream?(以及如何实施)
- 从或写入boost :: asio :: ssl :: stream :: next_layer()旁路SSL解密/加密
- 提升/ASIO/SSL 抛出"undefined reference"错误
- 使用 boost::asio SSL 服务器减少每个连接的内存使用量
- boost::asio::ssl::context::context(boost::asic::ssl::context
- 在同一系统上运行的多个boost::asio-ssl客户端
- 提升 asio ssl:如果私钥传递上下文::use_private_key,则不调用密码回调
- 提升 asio - SSL async_read,从一个线程async_write
- boost::asio-ssl链接错误
- Boost ASIO:SSL握手()永远不会结束
- Boost的ASIO + SSL在某些情况下不起作用
- 可以在多个ssl流之间共享boost::asio::ssl::上下文
- Boost asio & ssl & error code
- boost asio SSL async_shutdown总是以错误结束
- 如何修改boost::asio::ssl::context的方法