由于调试的原因,我有时需要捕获流量并进行分析。一个选项是配置OpenSSL或boost :: asio :: ssl以保持传输不变。我在API中找不到任何东西。有没有办法配置OpenSSL或boost :: asio :: ssl不加密?
回答
如果您可以配置连接的两端,则可以使用空密码。当您创建您的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;
}
我不知道如何告诉asio在使用boost :: asio :: ssl :: stream作为套接字对象时关闭加密。不过,我之前使用过Wireshark来查看通过线路传入和传出的SSL数据。 Wireshark提供了添加RSA密钥文件的功能,该文件用于解密数据,从而最终在窗口中显示原始数据。
要指定密钥文件,请调出Wireshark并选择编辑/首选项以调出首选项对话框。在窗口左侧的底部,应该有协议。点击它显示所有的协议。接下来,选择SSL。在窗口的右侧,您现在应该看到一个RSA密钥列表Edit ...按钮。点击该按钮弹出窗口来指定密钥文件。您需要为每个正在与之通话的服务器或客户端提供密钥文件,I/P地址和端口号。
Wireshark可以从这个link下载。
- 1. 是否读取或写入boost :: asio :: ssl :: stream :: next_layer()绕过SSL解密/加密?
- 2. openssl ssl加密
- 3. boost :: asio :: ssl :: context :: context(boost :: asio :: ssl :: context_base :: method)undefined符号
- 4. 有没有类似.NET(Mono)的boost :: asio?
- 5. 有没有办法让配置“递归”?
- 6. 有没有办法打破boost :: mpl for_each?
- 7. 没有填充的OpenSSL RSA加密无法正确加密
- 8. boost :: asio ssl链接错误
- 9. OpenSSL或没有命令行
- 10. Boost Asio SSL握手永不返回
- 11. Boost :: asio - UnregisterWaitEx'还没有被声明
- 12. 的boost ::支持ASIO :: async_read没有条件
- 13. 有没有办法在Perl中加载配置文件?
- 14. boost :: asio :: async_write没有完成其任务
- 15. 有没有办法在没有通配符证书的同一台服务器上配置多个SSL站点?
- 16. 有没有办法不加载jQuery?
- 17. 有没有办法让Parse.com配置为私人?
- 18. 有没有办法用不同的配置文件运行NUTCH?
- 19. boost :: asio和socket拥有
- 20. 有没有办法从Apache2配置中的HTTP授权标头获取密码?
- 21. XmlApplicationContext:有没有办法一次了解所有配置问题?
- 22. 有没有办法在Nginx配置里设置一个变量?
- 23. 有没有办法在DataSource配置中设置时区为UTC
- 24. Rails + Devise - 有没有办法禁止用户登录或重置密码?
- 25. boost :: asio :: async_read和boost :: asio :: streambuf
- 26. 有没有办法将heroku应用设置为私密?
- 27. 有没有办法阻止tabbar项目的配置?
- 28. 有没有办法在Hadoop中配置推测执行超时?
- 29. 有没有办法阻止MySQL配置中的MYSQL Delayed Inserts?
- 30. 有没有办法扩展Charm-Crypto方案来加密文件?
注意'提高:: ASIO :: SSL: :stream'与'asio:ip :: tcp :: socket'具有相同的I/O相关接口,所以它们在代码的大部分部分都是可以互换的,而你可以在运行时或编译时选择'asio:ip :: tcp :: socket' - 用于调试目的或者需要关闭加密。 –
2013-05-08 06:55:56
[在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
谢谢大家的好回答。我没有注意到SSL和非SSL套接字之间的相似性,我不知道Wireshark支持SSL解密。但是,对于调试,禁用加密比抽象套接字更容易,而Wireshark解决方案在数据部分损坏的情况下可能不起作用。 – shoren 2013-05-16 17:38:46