Rel*_*lla 7 c++ ssl https boost boost-asio
Theare是一个谨慎的少量boost :: asio :: ssl小型C++教育代码在线基础.更少关于boost :: asio :: ssl :: context :: load_verify_file所以我从这里找到一个代码,只需要很少的修改 - 使用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;
}
Run Code Online (Sandbox Code Playgroud)
这是一条非常奇怪的路线:context.load_verify_file("key.pem");所以我对它有一些疑问:
key.pem吗?简单来说 :
.pem文件可以包含证书(公钥),私钥或两者的组合.PEM是一种编码数据的方法,经过认证的X509通常与PEM一起使用.例如,服务器读取.pem文件并将证书发送到客户端,以便客户端可以在连接之前验证它.
具有自签名证书的服务器将在今天的浏览器上弹出警告,表示它不受信任(除非由CA签名,并且浏览器具有签名CA的数据库,他们使用这些数据库来验证证书是否"有效"或并且您可以检查证书详细信息并决定是否要信任该站点.一个很好的例子是IETF.org链接,因为他们的证书不久前已经过期了:)
作为客户,它可能意味着什么,但除非您需要它,否则它不需要.也就是说,如果服务器发送证书,您的客户端可能希望在继续之前对其进行验证,在这种情况下,您将需要来自签署服务器证书的CA的信息,该证书可以从包含该证书的.pem文件加载. CA信息.如果您的客户不关心验证,那么它不需要它.
基本上,该load_verify_file()功能加载CA信息以便执行服务器发送的证书的验证.
您可以创建自己的CA文件并签署自己的服务器证书,然后将自己的CA文件与客户端一起使用,以验证您是否正在连接到自己的服务器.
阅读1.没有客户端不发送它.
如果你想了解更多,这里有一个直接来自duckduckgo 的指南.
阅读3和本文的开头.
如果客户端接受服务器证书就好并且没有拒绝它,因为它无法验证它,那就没关系.易于检查,仅启用与服务器的ssl连接,并查看客户端是否将连接并执行应该的工作,或者只是嗅探流量并进行查找.
不确定你的意思.买ssl主机?如果是这样,如果您想要接受连接,问题仍然存在于您的客户端.
| 归档时间: |
|
| 查看次数: |
6877 次 |
| 最近记录: |