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

sho*_*ren 6 openssl boost-asio

出于调试原因,我有时需要捕获流量并对其进行分析.这样做的一个选择是配置OpenSSL或boost :: asio :: ssl以保持传输不受影响.我在API中找不到任何东西.

rha*_*oto 7

如果可以配置连接的两端,则可以使用空密码.当您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);
Run Code Online (Sandbox Code Playgroud)

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

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

openssl s_server -accept 8443 -cert server.pem -key server.pem -cipher eNULL
Run Code Online (Sandbox Code Playgroud)

添加-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;
}
Run Code Online (Sandbox Code Playgroud)