出于调试原因,我希望有时捕获流量并对其进行分析。这样做的一个选择是配置OpenSSL或boost :: asio :: ssl以保持传输不受影响。我在API中找不到任何东西。
答案 0 :(得分: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);
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;
}
答案 1 :(得分:3)
当使用boost :: asio :: ssl :: stream作为套接字对象时,我不知道如何告诉asio关闭加密。但是,之前我使用过Wireshark来查看进出的SSL数据。 Wireshark提供了添加RSA密钥文件的功能,该文件用于解密数据,从而最终在窗口中显示原始数据。
要指定密钥文件,请调出Wireshark并选择编辑/首选项以显示首选项对话框。在窗口左侧的底部,应该有Protocols。单击它以显示所有协议。接下来,选择SSL。在窗口的右侧,您现在应该看到RSA键列表编辑...按钮。单击该按钮以显示窗口以指定密钥文件。您需要拥有与之交谈的每个服务器或客户端的密钥文件,I / P地址和端口号。
可以从link下载Wireshark。