mirror of
https://github.com/pocoproject/poco.git
synced 2025-01-31 06:35:03 +01:00
NetSSL: add support for disabling certain protocols
This commit is contained in:
parent
3afbd82809
commit
556b4bd32f
@ -95,6 +95,15 @@ public:
|
|||||||
///
|
///
|
||||||
/// Client: Same as VERIFY_RELAXED.
|
/// Client: Same as VERIFY_RELAXED.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum Protocols
|
||||||
|
{
|
||||||
|
PROTO_SSLV2 = 0x01,
|
||||||
|
PROTO_SSLV3 = 0x02,
|
||||||
|
PROTO_TLSV1 = 0x04,
|
||||||
|
PROTO_TLSV1_1 = 0x08,
|
||||||
|
PROTO_TLSV1_2 = 0x10
|
||||||
|
};
|
||||||
|
|
||||||
Context(
|
Context(
|
||||||
Usage usage,
|
Usage usage,
|
||||||
@ -265,6 +274,14 @@ public:
|
|||||||
/// session resumption.
|
/// session resumption.
|
||||||
///
|
///
|
||||||
/// The feature can be disabled by calling this method.
|
/// The feature can be disabled by calling this method.
|
||||||
|
|
||||||
|
void disableProtocols(int protocols);
|
||||||
|
/// Disables the given protocols.
|
||||||
|
///
|
||||||
|
/// The protocols to be disabled are specified by OR-ing
|
||||||
|
/// values from the Protocols enumeration, e.g.:
|
||||||
|
///
|
||||||
|
/// context.disableProtocols(PROTO_SSLV2 | PROTO_SSLV3)
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void createSSLContext();
|
void createSSLContext();
|
||||||
|
@ -94,6 +94,7 @@ class NetSSL_API SSLManager
|
|||||||
/// <requireTLSv1>true|false</requireTLSv1>
|
/// <requireTLSv1>true|false</requireTLSv1>
|
||||||
/// <requireTLSv1_1>true|false</requireTLSv1_1>
|
/// <requireTLSv1_1>true|false</requireTLSv1_1>
|
||||||
/// <requireTLSv1_2>true|false</requireTLSv1_2>
|
/// <requireTLSv1_2>true|false</requireTLSv1_2>
|
||||||
|
/// <disableProtocols>sslv2,sslv3,tlsv1,tlsv1_1,tlsv1_2</disableProtocols>
|
||||||
/// </server|client>
|
/// </server|client>
|
||||||
/// <fips>false</fips>
|
/// <fips>false</fips>
|
||||||
/// </openSSL>
|
/// </openSSL>
|
||||||
@ -137,6 +138,8 @@ class NetSSL_API SSLManager
|
|||||||
/// - requireTLSv1 (boolean): Require a TLSv1 connection.
|
/// - requireTLSv1 (boolean): Require a TLSv1 connection.
|
||||||
/// - requireTLSv1_1 (boolean): Require a TLSv1.1 connection.
|
/// - requireTLSv1_1 (boolean): Require a TLSv1.1 connection.
|
||||||
/// - requireTLSv1_2 (boolean): Require a TLSv1.2 connection.
|
/// - requireTLSv1_2 (boolean): Require a TLSv1.2 connection.
|
||||||
|
/// - disableProtocols (string): A comma-separated list of protocols that should be
|
||||||
|
/// disabled. Valid protocol names are sslv2, sslv3, tlsv1, tlsv1_1, tlsv1_2.
|
||||||
/// - fips: Enable or disable OpenSSL FIPS mode. Only supported if the OpenSSL version
|
/// - fips: Enable or disable OpenSSL FIPS mode. Only supported if the OpenSSL version
|
||||||
/// that this library is built against supports FIPS mode.
|
/// that this library is built against supports FIPS mode.
|
||||||
{
|
{
|
||||||
@ -320,6 +323,7 @@ private:
|
|||||||
static const std::string CFG_REQUIRE_TLSV1;
|
static const std::string CFG_REQUIRE_TLSV1;
|
||||||
static const std::string CFG_REQUIRE_TLSV1_1;
|
static const std::string CFG_REQUIRE_TLSV1_1;
|
||||||
static const std::string CFG_REQUIRE_TLSV1_2;
|
static const std::string CFG_REQUIRE_TLSV1_2;
|
||||||
|
static const std::string CFG_DISABLE_PROTOCOLS;
|
||||||
|
|
||||||
#ifdef OPENSSL_FIPS
|
#ifdef OPENSSL_FIPS
|
||||||
static const std::string CFG_FIPS_MODE;
|
static const std::string CFG_FIPS_MODE;
|
||||||
|
@ -317,6 +317,41 @@ void Context::disableStatelessSessionResumption()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Context::disableProtocols(int protocols)
|
||||||
|
{
|
||||||
|
if (protocols & PROTO_SSLV2)
|
||||||
|
{
|
||||||
|
#if defined(SSL_OP_NO_SSLv2)
|
||||||
|
SSL_CTX_set_options(_pSSLContext, SSL_OP_NO_SSLv2);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (protocols & PROTO_SSLV3)
|
||||||
|
{
|
||||||
|
#if defined(SSL_OP_NO_SSLv3)
|
||||||
|
SSL_CTX_set_options(_pSSLContext, SSL_OP_NO_SSLv3);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (protocols & PROTO_TLSV1)
|
||||||
|
{
|
||||||
|
#if defined(SSL_OP_NO_TLSv1)
|
||||||
|
SSL_CTX_set_options(_pSSLContext, SSL_OP_NO_TLSv1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (protocols & PROTO_TLSV1_1)
|
||||||
|
{
|
||||||
|
#if defined(SSL_OP_NO_TLSv1_1)
|
||||||
|
SSL_CTX_set_options(_pSSLContext, SSL_OP_NO_TLSv1_1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (protocols & PROTO_TLSV1_2)
|
||||||
|
{
|
||||||
|
#if defined(SSL_OP_NO_TLSv1_2)
|
||||||
|
SSL_CTX_set_options(_pSSLContext, SSL_OP_NO_TLSv1_2);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Context::createSSLContext()
|
void Context::createSSLContext()
|
||||||
{
|
{
|
||||||
if (SSLManager::isFIPSEnabled())
|
if (SSLManager::isFIPSEnabled())
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "Poco/Net/SSLException.h"
|
#include "Poco/Net/SSLException.h"
|
||||||
#include "Poco/SingletonHolder.h"
|
#include "Poco/SingletonHolder.h"
|
||||||
#include "Poco/Delegate.h"
|
#include "Poco/Delegate.h"
|
||||||
|
#include "Poco/StringTokenizer.h"
|
||||||
#include "Poco/Util/Application.h"
|
#include "Poco/Util/Application.h"
|
||||||
#include "Poco/Util/OptionException.h"
|
#include "Poco/Util/OptionException.h"
|
||||||
|
|
||||||
@ -57,6 +58,7 @@ const std::string SSLManager::CFG_EXTENDED_VERIFICATION("extendedVerification");
|
|||||||
const std::string SSLManager::CFG_REQUIRE_TLSV1("requireTLSv1");
|
const std::string SSLManager::CFG_REQUIRE_TLSV1("requireTLSv1");
|
||||||
const std::string SSLManager::CFG_REQUIRE_TLSV1_1("requireTLSv1_1");
|
const std::string SSLManager::CFG_REQUIRE_TLSV1_1("requireTLSv1_1");
|
||||||
const std::string SSLManager::CFG_REQUIRE_TLSV1_2("requireTLSv1_2");
|
const std::string SSLManager::CFG_REQUIRE_TLSV1_2("requireTLSv1_2");
|
||||||
|
const std::string SSLManager::CFG_DISABLE_PROTOCOLS("disableProtocols");
|
||||||
#ifdef OPENSSL_FIPS
|
#ifdef OPENSSL_FIPS
|
||||||
const std::string SSLManager::CFG_FIPS_MODE("openSSL.fips");
|
const std::string SSLManager::CFG_FIPS_MODE("openSSL.fips");
|
||||||
const bool SSLManager::VAL_FIPS_MODE(false);
|
const bool SSLManager::VAL_FIPS_MODE(false);
|
||||||
@ -300,6 +302,26 @@ void SSLManager::initDefaultContext(bool server)
|
|||||||
_ptrDefaultClientContext = new Context(usage, privKeyFile, certFile, caLocation, verMode, verDepth, loadDefCA, cipherList);
|
_ptrDefaultClientContext = new Context(usage, privKeyFile, certFile, caLocation, verMode, verDepth, loadDefCA, cipherList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string disabledProtocolsList = config.getString(prefix + CFG_DISABLE_PROTOCOLS, "");
|
||||||
|
Poco::StringTokenizer dpTok(disabledProtocolsList, ";,", Poco::StringTokenizer::TOK_TRIM | Poco::StringTokenizer::TOK_IGNORE_EMPTY);
|
||||||
|
int disabledProtocols = 0;
|
||||||
|
for (Poco::StringTokenizer::Iterator it = dpTok.begin(); it != dpTok.end(); ++it)
|
||||||
|
{
|
||||||
|
if (*it == "sslv2")
|
||||||
|
disabledProtocols |= Context::PROTO_SSLV2;
|
||||||
|
else if (*it == "sslv3")
|
||||||
|
disabledProtocols |= Context::PROTO_SSLV3;
|
||||||
|
else if (*it == "tlsv1")
|
||||||
|
disabledProtocols |= Context::PROTO_TLSV1;
|
||||||
|
else if (*it == "tlsv1_1")
|
||||||
|
disabledProtocols |= Context::PROTO_TLSV1_1;
|
||||||
|
else if (*it == "tlsv1_2")
|
||||||
|
disabledProtocols |= Context::PROTO_TLSV1_2;
|
||||||
|
}
|
||||||
|
if (server)
|
||||||
|
_ptrDefaultServerContext->disableProtocols(disabledProtocols);
|
||||||
|
else
|
||||||
|
_ptrDefaultClientContext->disableProtocols(disabledProtocols);
|
||||||
|
|
||||||
bool cacheSessions = config.getBool(prefix + CFG_CACHE_SESSIONS, false);
|
bool cacheSessions = config.getBool(prefix + CFG_CACHE_SESSIONS, false);
|
||||||
if (server)
|
if (server)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user