如何在POCO C++库中正确使用OpenSSL
How to use OpenSSL in POCO C++ library correctly
根据 POCO 助手中的规范:
初始化 NetSSL 库以及底层 OpenSSL 库,通过调用 Poco::Crypto::OpenSSLInitializer::initialize()。 应在使用 NetSSL 库中的任何类之前调用。 NetSSL将自动初始化,通过 Poco::Crypto::OpenSSLInitializer 实例或类似机制 创建上下文或 SSLManager 实例时。 但是,建议调用 initializeSSL() 在任何情况下,在应用程序启动时。
当我想使用HTTPSClientSession
时,我必须先构造一个应用程序对象吗?如何在客户端中使用它?有人能告诉我吗?谢谢!
让我们以 Net/samples/httpget 为例,让我们复制 httpget/作为一个新的 httpsget 目录:
- 打开Makefile,添加"PocoNetSSL"到target_libs
- 将"HTTPClientSession"替换为"HTTPSClientSession"
- 您需要创建 Poco::Net::Context 以供 SSL 使用
- 将"HTTPClientSession session(uri.getHost(), uri.getPort());"替换为以下两行:
const Context::Ptr context = new Context(Context::CLIENT_USE, "", "", "", Context::VERIFY_NONE, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
HTTPSClientSession session(uri.getHost(), uri.getPort(), context);
总结:
- 添加 PocoNetSSL 作为lib_depends
- 使用 Poco::Net::Context with HTTPSClientSession
不,您不需要应用程序对象。下面是一个功能齐全的示例:
$ 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;
}
相关文章:
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 如何在openssl-ecc中获取十六进制格式的私钥
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- LINK 尝试使用 OpenSSL evp aes 256 c++ 时出错
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- OpenSSL TLS服务器-使用客户端证书白名单
- 通过 Openssl 命令行加密,通过 c++ 解密
- 使用已使用 java 编码的 openssl 解码数据
- Poco FindMySql.cmake 无法找到 MySQL 源代码
- OpenSSL没有共享密码
- OpenSSL 解密功能无法正常工作
- OpenSSL BIO and SSL_read
- 如何在OpenSSL库的名称中添加后缀'd'?
- 避免碎片化的ClientHellos with OpenSSL (DTLS)
- Boost.Asio/OpenSSL HTTPS GET certificate trouble
- 使用 OpenSSL 从内存中读取原始 SSL/TLS 证书
- 如何使用openssl续订过期的证书密钥或创建自签名证书密钥any.pem Poco c ++
- 使用 OpenSSL 兼容格式在 C# 中加密,在 Poco 中解密
- 如何在POCO C++库中正确使用OpenSSL
- Poco + OpenSSL + CA PEM : 1/2 相同站点的 2 个站点出现"Unacceptable certificate"错误