有没有办法配置 OpenSSL 或 boost::asio::ssl 不加密?

2024-01-08

出于调试原因,我有时想捕获流量并对其进行分析。一种选择是配置 OpenSSL 或 boost::asio::ssl 以保持传输不变。我在 API 中找不到任何内容。


如果您可以配置连接的两端,则可以使用空密码。当您创建您的boost::asio::ssl::stream仅使用不加密的密码对其进行配置。这可以使用 OpenSSL API 通过传递封装的 OpenSSL 指针来完成:

boost::asio::ssl::stream<boost::asio::ip::tcp::socket> sslSocket(io, ssl);
SSL_set_cipher_list(sslSocket.native_handle(), "eNULL");
SSL_set_options(sslSocket.native_handle(), SSL_OP_NO_COMPRESSION);

The SSL_set_cipher_list() http://www.openssl.org/docs/ssl/SSL_CTX_set_cipher_list.html调用设置允许的密码,并且"eNULL"匹配没有加密的密码(参见OpenSSL 密码 http://www.openssl.org/docs/apps/ciphers.html). The SSL_set_options() http://www.openssl.org/docs/ssl/SSL_CTX_set_options.html调用会关闭压缩,这与加密无关,但在不压缩的情况下更容易查看线路上的流量。SSL_OP_NO_COMPRESSION可能仅适用于 OpenSSL 0.9.9 或更高版本。如果您使用的是早期的 OpenSSL 版本,这一页 http://journal.paul.querna.org/articles/2011/04/05/openssl-memory-use/有一个解决方法来禁用压缩。在连接的一侧禁用压缩就足够了。

eNULL默认情况下不会启用密码,因此您需要显式配置两端。如果仅配置一端,则握手将失败。您可以使用 OpenSSL 设置一个简单的测试服务器s_server像这样的命令:

openssl s_server -accept 8443 -cert server.pem -key server.pem -cipher eNULL

添加-debugflag 还将转储协议,如果您的客户端禁用了压缩,您应该能够看到纯文本。

这是一个概念验证客户端,它将与上面的内容进行对话s_server命令 (verify_none模式用于简单,升级模式用于防止MITM攻击):

#include <boost/asio.hpp>
#include <boost/asio/ssl.hpp>

int main() {
   boost::asio::io_service io;

   boost::asio::ssl::context ssl(io,boost::asio::ssl::context::sslv23);
   ssl.set_verify_mode(boost::asio::ssl::context::verify_none);

   boost::asio::ssl::stream<boost::asio::ip::tcp::socket> sslSocket(io, ssl);
   SSL_set_cipher_list(sslSocket.native_handle(), "eNULL");
   SSL_set_options(sslSocket.native_handle(), SSL_OP_NO_COMPRESSION);

   boost::asio::ip::tcp::resolver resolver(io);
   boost::asio::ip::tcp::resolver::query query("localhost", "8443");
   boost::asio::ip::tcp::resolver::iterator endpoint = resolver.resolve(query);
   boost::system::error_code error = boost::asio::error::host_not_found;
   while (error && endpoint != boost::asio::ip::tcp::resolver::iterator())
   {
      sslSocket.lowest_layer().close();
      sslSocket.lowest_layer().connect(*endpoint++, error);
   }

   sslSocket.handshake(boost::asio::ssl::stream_base::client);
   boost::asio::write(sslSocket, boost::asio::buffer("how now brown cow\n"));
   sslSocket.shutdown(error);

   return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法配置 OpenSSL 或 boost::asio::ssl 不加密? 的相关文章

随机推荐