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

Posted

技术标签:

【中文标题】Poco+OpenSSL,错误:1416F086:SSL 例程:tls_process_server_certificate:证书验证失败【英文标题】:Poco+OpenSSL, error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed 【发布时间】:2018-12-21 23:13:20 【问题描述】:

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:certificate verify failed”。 从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】:

我有同样的异常: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 参数传递。

【讨论】:

您好,您是如何选择 cacert.pem 文件的?你能以某种方式使用系统证书吗?

以上是关于Poco+OpenSSL,错误:1416F086:SSL 例程:tls_process_server_certificate:证书验证失败的主要内容,如果未能解决你的问题,请参考以下文章

VS2015编译Poco+openssl,使用Poco发送HTTPS请求

如何在 POCO C++ 库中正确使用 OpenSSL

SSL 错误消息:错误:1416F086:SSL 例程:tls_process_server_certificate:证书验证失败

电报机器人 SSL 错误:SSL 错误 error:1416F086:SSL routines:tls_process_server_certificate:certificate verify fa

如何编译POCO

Linux 上 Poco::Logger 的编译器错误 - 函数声明被视为宏