OpenSSL 证书 "unable to get local issuer certificate"
OpenSSL Certificate "unable to get local issuer certificate"
我刚开始使用 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 请求,感谢任何帮助...
我刚刚设法做到了,对于任何感兴趣的人:
因为我只需要访问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);
现在我立即得到答案,没有任何错误或警告
我刚开始使用 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 请求,感谢任何帮助...
我刚刚设法做到了,对于任何感兴趣的人:
因为我只需要访问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);
现在我立即得到答案,没有任何错误或警告