Njå*_*aug 10 c++ ssl openssl pki poco-libraries
我正在尝试与SSL进行SSL握手www1.filemail.com
.我正在使用cURL cacert.pem
,但我收到此错误:
Unacceptable certificate from 188.138.81.30: application verification failure
Run Code Online (Sandbox Code Playgroud)
与任何其他HTTPS网站进行握手有效 - 包括www2.filemail.com
.www1
并且www2
应该配置相同 - 并且它们在所有浏览器中都能正常工作.他们也在这里测试很好(两个站点都发送了相同的证书和中间证书):
为什么我www1
使用OpenSSL和cacert.pem
文件会遇到这个问题?
www1和www2的证书设置必须有所不同.我已经使用无数的工具(openssl,ssllabs等)进行了测试,试图找出差异 - 但我总是得到两个站点完全相同的结果(运行我的代码时除外)
我在这里错过了什么?这些网站有什么区别?
(应该注意的是,我们使用的是RapidSSL提供的相对便宜的通配符证书 - 所以我猜它与中间证书或跨根证书有关 - 但是当使用上面提到的工具进行测试时,一切似乎都是有序的.)
码:
Poco::SharedPtr<Poco::Net::InvalidCertificateHandler> pCert = new Poco::Net::ConsoleCertificateHandler(false);
Poco::Net::Context::Ptr pContext = new Poco::Net::Context(Poco::Net::Context::CLIENT_USE, "", "", "C:\\cacert.pem", Poco::Net::Context::VERIFY_RELAXED, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
Poco::Net::SSLManager::instance().initializeClient(0, pCert, pContext);
URI uri("https://www1.filemail.com");
Poco::Net::SecureStreamSocket ss(Poco::Net::SocketAddress(uri.getHost().c_str(), uri.getPort()));
ss.completeHandshake();
Run Code Online (Sandbox Code Playgroud)
G\xc3\xbcnter Obiltschnig 通过 POCO@Github 帮助我,并通过替换使其工作
\n\nPoco::Net::SecureStreamSocket ss(Poco::Net::SocketAddress(uri.getHost().c_str(), uri.getPort()));\n
Run Code Online (Sandbox Code Playgroud)\n\n和
\n\nPoco::Net::SecureStreamSocket ss(Poco::Net::SocketAddress(uri.getHost().c_str(), uri.getPort()), uri.getHost());\n
Run Code Online (Sandbox Code Playgroud)\n\n(包括 SecureStreamSocket 构造函数中的主机名 - 它用于证书验证)
\n\n来自 POCO 文档:
\n\nSecureStreamSocket(\n const SocketAddress & address,\n const std::string & hostName\n);\n\n//Creates a secure stream socket using the default client SSL context and connects it to the socket specified by address.\n//The given host name is used for certificate verification <=======\n
Run Code Online (Sandbox Code Playgroud)\n\n我仍然不知道 www1 和 www2 之间配置的确切区别,如果有人能启发我,我会很高兴。
\n