Poco库(poco-1.9.0-all)和OpenSSL(来自slproweb站点的v1.1.0h)存在问题。 我无法与任何站点建立安全连接。
简单代码:
Poco::Net::initializeSSL();
Poco::Net::Context* pCtx = new Poco::Net::Context(Poco::Net::Context::Usage::TLSV1_2_CLIENT_USE, "", "cacert.pem", "", Poco::Net::Context::VerificationMode::VERIFY_RELAXED, 9, false);
Poco::Net::HTTPSClientSession cs("ya.ru", 443, pCtx);
Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_GET, "/?encoding=text", Poco::Net::HTTPMessage::HTTP_1_1);
Poco::Net::HTTPResponse resp;
try
{
Poco::Net::WebSocket sock(cs, req, resp);
}
catch (Poco::Net::SSLException& e)
{
cout << "ssl exception: " << e.displayText() << endl;
}
catch (...)
{
}
我从poco库中得到一个异常:“ SSL异常:错误:1416F086:SSL例程:tls_process_server_certificate:证书验证失败”。 从https://curl.haxx.se/docs/caextract.html
下载的文件cacert.pemOpenSSL通过Poco :: Net :: Context :: init(const Params&params)中的SSL_CTX_use_certificate_chain_file函数读取它而没有错误。
如果我在Poco :: Net :: Context构造函数中指定了验证模式VERIFY_NONE,则连接顺利通过。
也许我在Poco :: Net :: Context构造函数中设置了错误的参数?
答案 0 :(得分:0)
我有相同的异常:SSL异常:错误:1416F086:SSL例程:tls_process_server_certificate:证书验证失败。更改构造函数Poco :: Net :: Context构造函数参数的顺序有助于:
Poco::Net::Context(Poco::Net::Context::CLIENT_USE, "", "", "cacert.pem", Poco::Net::Context::VERIFY_RELAXED, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
cacert.pem是根CA证书文件,应作为caLocation参数传递。