【问题标题】:Is there a way to configure OpenSSL or boost::asio::ssl not to encrypt?有没有办法配置 OpenSSL 或 boost::asio::ssl 不加密?
【发布时间】:2013-05-07 19:03:04
【问题描述】:

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

【问题讨论】:

  • 请注意 boost::asio::ssl::stream<asio:ip::tcp::socket>asio:ip::tcp::socket 具有相同的 i/o 相关接口,因此它们在您的大部分代码中可以互换,您可以在运行时选择 asio:ip::tcp::socket或编译时 - 用于调试目的或如果需要关闭加密。
  • 谢谢大家的好答案。我没有注意到 SSL 和非 SSL 套接字之间的相似之处,我也不知道 Wireshark 支持 SSL 解密。但是,为了调试,我禁用加密比抽象套接字更容易,并且 Wireshark 解决方案可能无法在数据部分损坏的情况下工作。

标签: openssl boost-asio


【解决方案1】:

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

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);

SSL_set_cipher_list() 调用设置允许的密码,"eNULL" 匹配未加密的密码(请参阅OpenSSL ciphers)。 SSL_set_options() 调用关闭了与加密无关的压缩,但在没有压缩的情况下更容易查看线路上的流量。 SSL_OP_NO_COMPRESSION 可能仅适用于 OpenSSL 0.9.9 或更高版本。如果您使用的是较早的 OpenSSL 版本,this page 有一个解决方法来禁用压缩。在连接的一侧禁用压缩就足够了。

eNULL 默认情况下从不启用密码,因此您需要明确配置两端。如果只配置一端,则握手将失败。您可以使用 OpenSSL s_server 命令设置一个简单的测试服务器,如下所示:

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

添加-debug 标志也会转储协议,如果您的客户端禁用了压缩,您应该能够看到纯文本。

这是一个概念验证客户端,它将与上述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;
}

【讨论】:

    【解决方案2】:

    当使用 boost::asio::ssl::stream 作为套接字对象时,我不知道如何告诉 asio 关闭加密。但是,我之前使用过 Wireshark 来查看通过网络传入和传出的 SSL 数据。 Wireshark 提供了添加用于解密数据的 RSA 密钥文件的功能,从而最终在窗口中显示原始数据。

    要指定密钥文件,请打开 Wireshark 并选择 Edit / Preferences 以打开首选项对话框。在窗口左侧的底部,应该有协议。单击它以显示所有协议。接下来,选择 SSL。在窗口的右侧,您现在应该会看到一个 RSA 密钥列表 Edit... 按钮。单击该按钮以显示指定密钥文件的窗口。您需要拥有与您通话的每台服务器或客户端的密钥文件、I/P 地址和端口号。

    Wireshark 可以从这个link下载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 2015-06-13
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多