Poco + OpenSSL,错误:1416F086:SSL例程:tls_process_server_certificate:证书验证失败

时间:2018-07-13 14:25:03

标签: windows openssl poco

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.pem

OpenSSL通过Poco :: Net :: Context :: init(const Params&params)中的SSL_CTX_use_certificate_chain_file函数读取它而没有错误。

如果我在Poco :: Net :: Context构造函数中指定了验证模式VERIFY_NONE,则连接顺利通过。

也许我在Poco :: Net :: Context构造函数中设置了错误的参数?

1 个答案:

答案 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参数传递。