我尝试使用Boost Asio和Openssl将一些json发布到SSL服务器,我的情况是当代码与服务器执行握手时很烂,错误是 “握手:证书验证失败” 而且我什至不知道我已经Google搜索并浏览了相关网页的一个分支,我还没有找到答案,SSL客户端示例似乎对我不起作用,我做错了什么?
我的代码是
#include "root_certificates.hpp"
#include <boost/beast/core.hpp>
#include <boost/beast/http.hpp>
#include <boost/beast/version.hpp>
#include <boost/asio/connect.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/ssl/error.hpp>
#include <boost/asio/ssl/stream.hpp>
#include <cstdlib>
#include <iostream>
#include <string>
#include <time.h>
#include<fstream>
#include <ctime>
#include <istream>
int postsslserver()
{
try
{
auto const host ="mydomain.com";
auto const port = "https";
auto const target ="/apps/postpage.html" ;
retcode = 0;
char mybuffer[80];
setlocale(LC_ALL, "");
pwmd5hashed = "mysecret";
std::string jsondata ="\"Double\":12.0000001,";
int version =11;
// The io_context is required for all I/O
boost::asio::io_context ioc;
// The SSL context is required, and holds certificates
ssl::context ctx{ ssl::context::sslv23_client };
//20181021
ctx.set_default_verify_paths();
// This holds the root certificate used for verification
//load_root_certificates(ctx);
// Verify the remote server's certificate
//ctx.set_verify_mode(ssl::verify_peer);
ctx.set_verify_mode(ssl::verify_peer);
// These objects perform our I/O
tcp::resolver resolver{ ioc };
ssl::stream<tcp::socket> stream{ ioc, ctx };
// Set SNI Hostname (many hosts need this to handshake successfully)
if (!SSL_set_tlsext_host_name(stream.native_handle(), host))
{
boost::system::error_code ec{ static_cast<int>(::ERR_get_error()), boost::asio::error::get_ssl_category() };
throw boost::system::system_error{ ec };
}
// Look up the domain name
auto const results = resolver.resolve(host, port);
// Make the connection on the IP address we get from a lookup
boost::asio::connect(stream.next_layer(), results.begin(), results.end());
// Perform the SSL handshake
stream.handshake(ssl::stream_base::client);// error always occured this line of code,the error hints was "handshake: certificate verify failed"
// Set up an HTTP POST request message
http::request<http::string_body> req{ http::verb::post, target, version };
req.set(http::field::host, host);
req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
req.set(http::field::content_type, "application/json");
req.set(http::field::body, jsondata);
//req.keep_alive(req.keep_alive());
// Send the HTTP request to the remote host
http::write(stream, req);
// This buffer is used for reading and must be persisted
boost::beast::flat_buffer buffer;
// Declare a container to hold the response
http::response<http::dynamic_body> res;
// Receive the HTTP response
http::read(stream, buffer, res);
// Write the message to standard out
std::cout << res << std::endl;
// Gracefully close the stream
boost::system::error_code ec;
stream.shutdown(ec);
if (ec == boost::asio::error::eof)
{
// Rationale:
// http://stackoverflow.com/questions/25587403/boost-asio-ssl-async-shutdown-always-finishes-with-an-error
ec.assign(0, ec.category());
}
if (ec)
throw boost::system::system_error{ ec };
// If we get here then the connection is closed gracefully
}
catch (std::exception const& e)
{
//std::cerr << "Error: " << e.what() << std::endl;
write_text_to_log_file(e.what());
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
预先感谢