C++ 如何在POCO C+中使用OpenSSL+;正确的图书馆
根据POCO assistant中的规范: 初始化NetSSL库以及底层OpenSSL 库,通过调用Poco::Crypto::OpenSSLInitializer::initialize()。 应在使用NetSSL库中的任何类之前调用。 NetSSL将通过以下方式自动初始化: Poco::Crypto::OpenSSLinitalizer实例或类似机制 创建上下文或SSLManager实例时。 但是,建议调用initializeSSL() 无论如何,在应用程序启动时 当我想使用C++ 如何在POCO C+中使用OpenSSL+;正确的图书馆,c++,https,openssl,poco-libraries,C++,Https,Openssl,Poco Libraries,根据POCO assistant中的规范: 初始化NetSSL库以及底层OpenSSL 库,通过调用Poco::Crypto::OpenSSLInitializer::initialize()。 应在使用NetSSL库中的任何类之前调用。 NetSSL将通过以下方式自动初始化: Poco::Crypto::OpenSSLinitalizer实例或类似机制 创建上下文或SSLManager实例时。 但是,建议调用initializeSSL() 无论如何,在应用程序启动时 当我想使用HTTPSCli
HTTPSClientSession
时,我必须先构造一个应用程序对象吗?
如何在客户端使用它?有人能告诉我吗?非常感谢 以Net/samples/httpget为例,将httpget/复制为一个新的httpsget目录:
不需要,您不需要应用程序对象。下面是一个功能完整的示例:
$ httpsget https://httpbin.org/user-agent
{
"user-agent": "Poco HTTPSClientSession"
}
代码:
#包括“Poco/StreamCopier.h”
#包括“Poco/URI.h”
#包括“Poco/Exception.h”
#包括“Poco/SharedPtr.h”
#包括“Poco/Net/SSLManager.h”
#包括“Poco/Net/KeyConsoleHandler.h”
#包括“Poco/Net/ConsoleCertificateHandler.h”
#包括“Poco/Net/HTTPSClientSession.h”
#包括“Poco/Net/HTTPRequest.h”
#包括“Poco/Net/HTTPResponse.h”
#包括
#包括
使用名称空间Poco;
使用名称空间Poco::Net;
SS2类搽剂{
公众:
SSLInitializer(){Poco::Net::initializeSSL();}
~SSLInitializer(){Poco::Net::uninitializeSSL();}
};
int main(int argc,字符**argv)
{
sSlinilizer sSlinilizer;
SharedPtr ptrCert=新的控制台证书管理员(false);
Context::Ptr ptrContext=新上下文(Context::CLIENT_USE,“,”,“rootcert.pem”,Context::VERIFY_STRICT,9,false,“ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH”);
SSLManager::instance().initializeClient(0,ptrCert,ptrContext);
尝试
{
如果(argc>1)
{
URI(argv[1]);
httpsclients会话(uri.getHost(),uri.getPort());
HTTPRequest请求(HTTPRequest::HTTP_GET,uri.getPath());
set(“用户代理”、“Poco HTTPSClientSession”);
s、 发送请求(请求);
HTTPResponse响应;
std::istream&rs=s.接收方响应(响应);
StreamCopier::copyStream(rs,std::cout);
}
}
捕获(例外和例外)
{
std::cout Context::VERIFY_NONE,“客户端:如果不使用匿名密码(默认禁用),服务器将发送一个将被检查的证书,但检查结果将被忽略。”这基本上不是违背了证书的观点吗?proteneer的观点很好。更改为verificationMode=Context::Verification\u STRICT和loadDefaultCAs=true似乎是一个更明智的默认值。除了Verification\u NONE
之外的任何东西似乎都比Verification\u NONE
更安全,但有些主机没有有效的证书……:-(我注意到您没有将上下文传递给会话,这是故意的吗?是的,将使用initializeClient()提供的默认上下文:
$ httpsget https://httpbin.org/user-agent
{
"user-agent": "Poco HTTPSClientSession"
}
#include "Poco/StreamCopier.h"
#include "Poco/URI.h"
#include "Poco/Exception.h"
#include "Poco/SharedPtr.h"
#include "Poco/Net/SSLManager.h"
#include "Poco/Net/KeyConsoleHandler.h"
#include "Poco/Net/ConsoleCertificateHandler.h"
#include "Poco/Net/HTTPSClientSession.h"
#include "Poco/Net/HTTPRequest.h"
#include "Poco/Net/HTTPResponse.h"
#include <memory>
#include <iostream>
using namespace Poco;
using namespace Poco::Net;
class SSLInitializer {
public:
SSLInitializer() { Poco::Net::initializeSSL(); }
~SSLInitializer() { Poco::Net::uninitializeSSL(); }
};
int main(int argc, char** argv)
{
SSLInitializer sslInitializer;
SharedPtr<InvalidCertificateHandler> ptrCert = new ConsoleCertificateHandler(false);
Context::Ptr ptrContext = new Context(Context::CLIENT_USE, "", "", "rootcert.pem", Context::VERIFY_STRICT, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
SSLManager::instance().initializeClient(0, ptrCert, ptrContext);
try
{
if (argc > 1)
{
URI uri(argv[1]);
HTTPSClientSession s(uri.getHost(), uri.getPort());
HTTPRequest request(HTTPRequest::HTTP_GET, uri.getPath());
request.set("user-agent", "Poco HTTPSClientSession");
s.sendRequest(request);
HTTPResponse response;
std::istream& rs = s.receiveResponse(response);
StreamCopier::copyStream(rs, std::cout);
}
}
catch (Exception& ex)
{
std::cout << ex.displayText() << std::endl;
return 1;
}
return 0;
}