2013-05-07 126 views
4

由于调试的原因,我有时需要捕获流量并进行分析。一个选项是配置OpenSSL或boost :: asio :: ssl以保持传输不变。我在API中找不到任何东西。有没有办法配置OpenSSL或boost :: asio :: ssl不加密?

+0

注意'提高:: ASIO :: SSL: :stream '与'asio:ip :: tcp :: socket'具有相同的I/O相关接口,所以它们在代码的大部分部分都是可以互换的,而你可以在运行时或编译时选择'asio:ip :: tcp :: socket' - 用于调试目的或者需要关闭加密。 – 2013-05-08 06:55:56

+0

[在Boost.Asio中同时使用SSL套接字和非SSL套接字?](http://stackoverflow.com/questions/4720120/using-ssl-sockets-and-non-ssl-sockets-simultaneously-in -boost-asio) – 2013-05-08 15:58:16

+0

谢谢大家的好回答。我没有注意到SSL和非SSL套接字之间的相似性,我不知道Wireshark支持SSL解密。但是,对于调试,禁用加密比抽象套接字更容易,而Wireshark解决方案在数据部分损坏的情况下可能不起作用。 – shoren 2013-05-16 17:38:46

回答

4

如果您可以配置连接的两端,则可以使用空密码。当您创建您的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); 

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模式用于简单,升级模式,以防止中间人攻击):

#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

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

要指定密钥文件,请调出Wireshark并选择编辑/首选项以调出首选项对话框。在窗口左侧的底部,应该有协议。点击它显示所有的协议。接下来,选择SSL。在窗口的右侧,您现在应该看到一个RSA密钥列表Edit ...按钮。点击该按钮弹出窗口来指定密钥文件。您需要为每个正在与之通话的服务器或客户端提供密钥文件,I/P地址和端口号。

Wireshark可以从这个link下载。

相关问题