OpenSSL 证书“无法获取本地颁发者证书”

时间:2020-12-28 11:59:03

标签: c++ ssl openssl ssl-certificate poco

我刚开始使用 Poco C++ 库,我刚刚编译了 NetSSL-OpenSSL 下载示例。 将它与 http 站点一起使用时,一切正常,但是当我将它与 https 站点一起使用时,出现以下错误:

>download.exe https://api.github.com

WARNING: Certificate verification failed
----------------------------------------
Issuer Name:  C=US,O=DigiCert Inc,OU=www.digicert.com,CN=DigiCert High Assurance EV Root CA
Subject Name: C=US,O=DigiCert Inc,OU=www.digicert.com,CN=DigiCert SHA2 High Assurance Server CA

The certificate yielded the error: unable to get local issuer certificate

The error occurred in the certificate chain at position 1
Accept the certificate (y,n)?

奇怪的是,在说是后内容仍然可以正常加载,但我真的希望我的程序干净并且在互联网安全方面也是安全的。

这是我当前状态的代码,但我真的不知道自己在做什么,所以请指出正确的方向:

// POCO C++ Libraries used

SharedPtr<InvalidCertificateHandler> ptrCert = new ConsoleCertificateHandler(false);
Context::Ptr ptrContext = new Context(Context::CLIENT_USE, "", "cert.pem", "", Context::VerificationMode::VERIFY_NONE);
SSLManager::instance().initializeClient(0, ptrCert, ptrContext);

URI uri(argv[1]);
std::unique_ptr<std::istream> pStr(URIStreamOpener::defaultOpener().open(uri));
StreamCopier::copyStream(*pStr.get(), std::cout);

我用 openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes 生成了 cert.pem 文件,希望这会生成一个证书,但我不知道我需要什么证书以及在我的 C++ 程序中指定它们的位置。

我的目标是连接到 Github API 页面并阅读 GET 请求,感谢任何帮助...

1 个答案:

答案 0 :(得分:1)

我只是设法做到了,对于任何感兴趣的人:

由于我只需要访问Github API,所以我只需要验证github使用的证书,即DigiCert。

我访问了这个页面 https://www.digicert.com/kb/digicert-root-certificates.htm 并下载了文件 DigiCertHighAssuranceEVRootCA.crt.pem,将它复制到我的 exe 旁边,然后在我的 C++ 程序中指定它:

SharedPtr<InvalidCertificateHandler> ptrCert = new ConsoleCertificateHandler(false);
Context::Ptr ptrContext = new Context(Context::CLIENT_USE, "", "", "DigiCertHighAssuranceEVRootCA.crt.pem", Context::VerificationMode::VERIFY_RELAXED);
SSLManager::instance().initializeClient(0, ptrCert, ptrContext);

现在我立即得到答案,没有任何错误或警告