gpt4 book ai didi

c++ - 什么是 boost::asio::ssl::context::load_verify_file 以及如何使用它?

转载 作者:可可西里 更新时间:2023-11-01 18:36:17 26 4
gpt4 key购买 nike

有少量的 boost::asio::ssl在线小型 C++ 教育代码库。在 boost::asio::ssl::context::load_verify_file 上就更少了所以我从here找到了一个修改最少的代码 - 使用 boost 1.47.0 编译和运行:

#include <boost/asio.hpp>
#include <boost/asio/ssl.hpp>
#include <boost/bind.hpp>
#include <iostream>
#include <istream>
#include <ostream>
#include <string>


class client
{
public:
client(boost::asio::io_service& io_service, boost::asio::ssl::context& context, boost::asio::ip::tcp::resolver::iterator endpoint_iterator)
: socket_(io_service, context)
{
socket_.set_verify_mode(boost::asio::ssl::context::verify_none);
socket_.set_verify_callback(boost::bind(&client::verify_certificate, this, _1, _2));

boost::asio::async_connect(socket_.lowest_layer(), endpoint_iterator, boost::bind(&client::handle_connect, this, boost::asio::placeholders::error));
}

bool verify_certificate(bool preverified, boost::asio::ssl::verify_context& ctx)
{
char subject_name[256];
X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle());
X509_NAME_oneline(X509_get_subject_name(cert), subject_name, 256);
std::cout << "Verifying:\n" << subject_name << std::endl;

return preverified;
}

void handle_connect(const boost::system::error_code& error)
{
if(!error){
std::cout << "Connection OK!" << std::endl;
socket_.async_handshake(boost::asio::ssl::stream_base::client, boost::bind(&client::handle_handshake, this, boost::asio::placeholders::error));
}else{
std::cout << "Connect failed: " << error.message() << std::endl;
}
}

void handle_handshake(const boost::system::error_code& error)
{
if(!error){
std::cout << "Sending request: " << std::endl;

std::stringstream request_;

request_ << "GET /api/0/data/ticker.php HTTP/1.1\r\n";
request_ << "Host: mtgox.com\r\n";
request_ << "Accept-Encoding: *\r\n";
request_ << "\r\n";

std::cout << request_.str() << std::endl;

boost::asio::async_write(socket_, boost::asio::buffer(request_.str()), boost::bind(&client::handle_write, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}else{
std::cout << "Handshake failed: " << error.message() << std::endl;
}
}

void handle_write(const boost::system::error_code& error, size_t bytes_transferred)
{
if (!error){
std::cout << "Sending request OK!" << std::endl;
boost::asio::async_read(socket_, boost::asio::buffer(reply_, bytes_transferred), boost::bind(&client::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}else{
std::cout << "Write failed: " << error.message() << std::endl;
}
}

void handle_read(const boost::system::error_code& error, size_t bytes_transferred)
{
if (!error){
std::cout << "Reply: ";
std::cout.write(reply_, bytes_transferred);
std::cout << "\n";
}else{
std::cout << "Read failed: " << error.message() << std::endl;
}
}

private:
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket_;
char reply_[0x1 << 16];
};

int main(int argc, char* argv[])
{
try{
boost::asio::io_service io_service;

boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query("mtgox.com", "443");
boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);

boost::asio::ssl::context context(boost::asio::ssl::context::sslv23);
//context.load_verify_file("key.pem"); // uncomment this line

client c(io_service, context, iterator);

io_service.run();
}catch (std::exception& e){
std::cerr << "Exception: " << e.what() << "\n";
}

std::cin.get();
return 0;
}

这是一个非常奇怪的行:context.load_verify_file("key.pem"); 所以我有一些关于它的问题:

  1. 作为 http 客户端对我来说意味着什么?
  2. 是否发送到服务器?
  3. 如何创建这样的文件?
  4. 它到底有什么用?
  5. 代码编译并使用它。可以吗?如果没有 key.pem,我们与服务器的连接是否安全?
  6. 我想使用 google 或其他大型 ssl 主机。我该怎么办?

最佳答案

简单来说:

.pem 文件可以包含证书(公钥)或私钥,或两者的组合。 PEM是一种对数据进行编码的方式,经过X509认证的通常与PEM一起使用。例如,服务器读取 .pem 文件并将证书发送给客户端,以便客户端在连接前验证它。

具有自签名证书的服务器会在当今的浏览器上弹出警告,指出它不受信任(除非由 CA 签名,并且浏览器有一个已签名 CA 的数据库,他们使用该数据库来验证证书是否有效是否“有效”),您可以检查证书详细信息并决定是否要信任该站点。一个很好的例子是 IETF.org链接,因为他们的证书不久前过期了:)

  1. 作为客户,这可能意味着什么,但除非您需要,否则不需要。这就是说,如果服务器发送了证书,您的客户端可能希望在继续之前验证它,在这种情况下,您将需要来自签署服务器证书的 CA 的信息,这些信息可以加载来自包含 CA 信息的 .pem 文件。如果您的客户不关心验证,那么它就不需要它。

    基本上,load_verify_file() 函数会加载 CA 信息,以便对服务器发送的证书进行验证。

    您可以创建自己的 CA 文件并签署自己的服务器证书,然后将您自己的 CA 文件与客户端一起使用,以验证您正在连接到自己的服务器。

  2. 读1.No客户端不发送。

  3. 如果你想了解更多,这里是guide直接来自 duckduckgo。

  4. 阅读 3 和本文的开头。

  5. 如果客户端很好地接受了服务器证书并且没有因为无法验证而拒绝它,那么就没问题。易于检查,只启用与服务器的 ssl 连接,看看客户端是否会连接并执行它应该执行的工作,或者只是嗅探流量并进行查找。

  6. 不确定您的意思。购买 ssl 主机?如果是这样,问题仍然出在您的客户端是否要接受连接。

关于c++ - 什么是 boost::asio::ssl::context::load_verify_file 以及如何使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7324425/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com