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请求
SSL 错误消息:错误:1416F086:SSL 例程:tls_process_server_certificate:证书验证失败
电报机器人 SSL 错误:SSL 错误 error:1416F086:SSL routines:tls_process_server_certificate:certificate verify fa