Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法将OpenSSL或boost::asio::ssl配置为不加密?_Openssl_Boost Asio - Fatal编程技术网

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

有没有办法将OpenSSL或boost::asio::ssl配置为不加密?,openssl,boost-asio,Openssl,Boost Asio,出于调试原因,我有时希望捕获流量并对其进行分析。一个选项是配置OpenSSL或boost::asio::ssl以保持传输不受影响。我在API中找不到任何内容。当使用boost::asio::ssl::stream作为套接字对象时,我不知道如何告诉asio关闭加密。但是,我以前使用过Wireshark来查看SSL数据通过网络进出。Wireshark提供了添加RSA密钥文件的功能,该文件用于解密数据,从而在窗口中显示原始数据 要指定密钥文件,请调出Wireshark,然后选择“编辑/首选项”以调出“

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

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

要指定密钥文件,请调出Wireshark,然后选择“编辑/首选项”以调出“首选项”对话框。在窗口左侧的底部,应该有协议。单击该按钮可显示所有协议。接下来,选择SSL。在窗口的右侧,您现在应该看到一个RSA密钥列表编辑。。。按钮单击该按钮以打开窗口以指定密钥文件。您需要拥有与之交谈的每个服务器或客户端的密钥文件、I/P地址和端口号


Wireshark可以从这里下载。

如果可以配置连接的两端,则可以使用空密码。创建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);
添加-debug标志还将转储协议,如果客户端禁用了压缩,您应该能够看到纯文本

下面是一个概念验证客户端,它将与上面的s_服务器命令进行对话。为了简单起见,使用了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;
}

请注意,boost::asio::ssl::stream与asio:ip::tcp::socket具有相同的i/o相关接口,因此它们在代码的大部分部分都是可互换的,您可以在运行时或编译时选择asio:ip::tcp::socket,无论是出于调试目的还是需要关闭加密。可能是重复的,谢谢大家给出的好答案。我没有注意到SSL和非SSL套接字之间的相似性,我也不知道Wireshark支持SSL解密。但是,对于调试来说,禁用加密比抽象套接字更容易,而且Wireshark解决方案在数据部分损坏的情况下可能无法工作。
#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;
}