Net module

SSLContext

OpenSSL SSL_CTX wrapper for client and server TLS configuration.

SSLContext

#include <icy/net/sslcontext.h>

OpenSSL SSL_CTX wrapper for client and server TLS configuration.

This class encapsulates context information for an SSL server or client, such as the certificate verification mode and the location of certificates and private key files, as well as the list of supported ciphers.

The Context class is also used to control SSL session caching on the server and client side.

Public Methods

ReturnNameDescription
SSLContextCreates a Context.
SSLContextCreates a Context.
~SSLContextDestroys the Context.
voiduseCertificateSets the certificate to be used by the Context.
voidaddChainCertificateAdds a certificate for certificate chain validation.
voidaddVerificationCertificateSets the private key to be used by the Context.
SSL_CTX *sslContext const inlineReturns the underlying OpenSSL SSL Context object.
Usageusage const inlineReturns whether the context is for use by a client or by a server and whether TLSv1 is required.
boolisForServerUse const inlineReturns true if the context is for use by a server.
SSLContext::VerificationModeverificationMode const inlineReturns the verification mode.
voidenableSessionCacheEnable or disable SSL/TLS session caching. For session caching to work, it must be enabled on the server, as well as on the client side.
voidenableSessionCacheEnables or disables SSL/TLS session caching on the server. For session caching to work, it must be enabled on the server, as well as on the client side.
boolsessionCacheEnabled constReturns true if the session cache is enabled.
voidsetSessionCacheSizeSets the maximum size of the server session cache, in number of sessions. The default size (according to OpenSSL documentation) is 1024*20, which may be too large for many applications, especially on embedded platforms with limited memory.
size_tgetSessionCacheSize constReturns the current maximum size of the server session cache.
voidsetSessionTimeoutSets the timeout (in seconds) of cached sessions on the server. A cached session will be removed from the cache if it has not been used for the given number of seconds.
longgetSessionTimeout constReturns the timeout (in seconds) of cached sessions on the server.
voidflushSessionCacheFlushes the SSL session cache on the server.
voiddisableStatelessSessionResumptionNewer versions of OpenSSL support RFC 4507 tickets for stateless session resumption.
voidsetALPNProtocolsSet the ALPN protocols for negotiation. Protocols should be in preference order. Example: {"h2", "http/1.1"}
SSLContextDeleted constructor.
SSLContextDeleted constructor.

SSLContext

SSLContext(Usage usage, const std::string & privateKeyFile, const std::string & certificateFile, const std::string & caLocation, VerificationMode verificationMode, int verificationDepth, bool loadDefaultCAs, const std::string & cipherList)

Creates a Context.

  • usage specifies whether the context is used by a client or server.

  • privateKeyFile contains the path to the private key file used for encryption. Can be empty if no private key file is used.

  • certificateFile contains the path to the certificate file (in PEM format). If the private key and the certificate are stored in the same file, this can be empty if privateKeyFile is given.

  • caLocation contains the path to the file or directory containing the CA/root certificates. Can be empty if the OpenSSL builtin CA certificates are used (see loadDefaultCAs).

  • verificationMode specifies whether and how peer certificates are validated.

  • verificationDepth sets the upper limit for verification chain sizes. Verification will fail if a certificate chain larger than this is encountered.

  • loadDefaultCAs specifies whether the builtin CA certificates from OpenSSL are used.

  • cipherList specifies the supported ciphers in OpenSSL notation.

Note: If the private key is protected by a passphrase, a PrivateKeyPassphraseHandler must have been setup with the SSLManager, or the SSLManager's PrivateKeyPassphraseRequired event must be handled.


SSLContext

SSLContext(Usage usage, const std::string & caLocation, VerificationMode verificationMode, int verificationDepth, bool loadDefaultCAs, const std::string & cipherList)

Creates a Context.

  • usage specifies whether the context is used by a client or server.

  • caLocation contains the path to the file or directory containing the CA/root certificates. Can be empty if the OpenSSL builtin CA certificates are used (see loadDefaultCAs).

  • verificationMode specifies whether and how peer certificates are validated.

  • verificationDepth sets the upper limit for verification chain sizes. Verification will fail if a certificate chain larger than this is encountered.

  • loadDefaultCAs specifies whether the builtin CA certificates from OpenSSL are used.

  • cipherList specifies the supported ciphers in OpenSSL notation.

Note that a private key and/or certificate must be specified with usePrivateKey()/useCertificate() before the Context can be used.


~SSLContext

~SSLContext() noexcept

Destroys the Context.


useCertificate

void useCertificate(crypto::X509Certificate & certificate)

Sets the certificate to be used by the Context.

To set-up a complete certificate chain, it might be necessary to call addChainCertificate() to specify additional certificates.

Note that useCertificate() must always be called before usePrivateKey().


addChainCertificate

void addChainCertificate(crypto::X509Certificate & certificate)

Adds a certificate for certificate chain validation.


addVerificationCertificate

void addVerificationCertificate(crypto::X509Certificate & certificate)

Sets the private key to be used by the Context.

Note that useCertificate() must always be called before usePrivateKey().

Note: If the private key is protected by a passphrase, a PrivateKeyPassphraseHandler must have been setup with the SSLManager, or the SSLManager's PrivateKeyPassphraseRequired event must be handled. Adds the given certificate to the list of trusted certificates that will be used for verification.


sslContext

const inline

inline SSL_CTX * sslContext() const

Returns the underlying OpenSSL SSL Context object.


usage

const inline

inline Usage usage() const

Returns whether the context is for use by a client or by a server and whether TLSv1 is required.


isForServerUse

const inline

inline bool isForServerUse() const

Returns true if the context is for use by a server.


verificationMode

const inline

inline SSLContext::VerificationMode verificationMode() const

Returns the verification mode.


enableSessionCache

void enableSessionCache(bool flag)

Enable or disable SSL/TLS session caching. For session caching to work, it must be enabled on the server, as well as on the client side.

The default is disabled session caching.

To enable session caching on the server side, use the two-argument version of this method to specify a session ID context.


enableSessionCache

void enableSessionCache(bool flag, std::string_view sessionIdContext)

Enables or disables SSL/TLS session caching on the server. For session caching to work, it must be enabled on the server, as well as on the client side.

SessionIdContext contains the application's unique session ID context, which becomes part of each session identifier generated by the server within this context. SessionIdContext can be an arbitrary sequence of bytes with a maximum length of SSL_MAX_SSL_SESSION_ID_LENGTH.

A non-empty sessionIdContext should be specified even if session caching is disabled to avoid problems with clients requesting to reuse a session (e.g. Firefox 3.6).

This method may only be called on SERVER_USE Context objects.


sessionCacheEnabled

const

bool sessionCacheEnabled() const

Returns true if the session cache is enabled.


setSessionCacheSize

void setSessionCacheSize(size_t size)

Sets the maximum size of the server session cache, in number of sessions. The default size (according to OpenSSL documentation) is 1024*20, which may be too large for many applications, especially on embedded platforms with limited memory.

Specifying a size of 0 will set an unlimited cache size.

This method may only be called on SERVER_USE Context objects.


getSessionCacheSize

const

size_t getSessionCacheSize() const

Returns the current maximum size of the server session cache.

This method may only be called on SERVER_USE Context objects.


setSessionTimeout

void setSessionTimeout(long seconds)

Sets the timeout (in seconds) of cached sessions on the server. A cached session will be removed from the cache if it has not been used for the given number of seconds.

This method may only be called on SERVER_USE Context objects.


getSessionTimeout

const

long getSessionTimeout() const

Returns the timeout (in seconds) of cached sessions on the server.

This method may only be called on SERVER_USE Context objects.


flushSessionCache

void flushSessionCache()

Flushes the SSL session cache on the server.

This method may only be called on SERVER_USE Context objects.


disableStatelessSessionResumption

void disableStatelessSessionResumption()

Newer versions of OpenSSL support RFC 4507 tickets for stateless session resumption.

The feature can be disabled by calling this method.


setALPNProtocols

void setALPNProtocols(const std::vector< std::string > & protocols)

Set the ALPN protocols for negotiation. Protocols should be in preference order. Example: {"h2", "http/1.1"}


SSLContext

SSLContext(const SSLContext &) = delete

Deleted constructor.


SSLContext

SSLContext(SSLContext &&) = delete

Deleted constructor.

Public Static Methods

ReturnNameDescription
voidenableSNI staticEnable SNI (Server Name Indication) for a specific SSL connection. The hostname is sent during the TLS handshake to allow the server to select the appropriate certificate.

enableSNI

static

static void enableSNI(SSL * ssl, const std::string & hostname)

Enable SNI (Server Name Indication) for a specific SSL connection. The hostname is sent during the TLS handshake to allow the server to select the appropriate certificate.

Public Types

NameDescription
Usage
VerificationMode
Ptr

Usage

enum Usage
ValueDescription
CLIENT_USEContext is used by a client.
SERVER_USEContext is used by a server.
TLSV1_CLIENT_USEContext is used by a client requiring TLSv1.
TLSV1_SERVER_USEContext is used by a server requiring TLSv2.

VerificationMode

enum VerificationMode
ValueDescription
VERIFY_NONEServer: The server will not send a client certificate request to the client, so the client will not send a certificate.
VERIFY_RELAXEDServer: The server sends a client certificate request to the client. The certificate returned (if any) is checked. If the verification process fails, the TLS/SSL handshake is immediately terminated with an alert message containing the reason for the verification failure.
VERIFY_STRICTServer: If the client did not return a certificate, the TLS/SSL handshake is immediately terminated with a handshake failure alert.
VERIFY_ONCEServer: Only request a client certificate on the initial TLS/SSL handshake. Do not ask for a client certificate again in case of a renegotiation.

Ptr

std::shared_ptr< SSLContext > Ptr()

Private Attributes

ReturnNameDescription
Usage_usage
VerificationMode_mode
SSL_CTX *_sslContext
std::vector< unsigned char >_alpnWireWire-format ALPN protocols for server selection.

_usage

Usage _usage

_mode

VerificationMode _mode

_sslContext

SSL_CTX * _sslContext

_alpnWire

std::vector< unsigned char > _alpnWire

Wire-format ALPN protocols for server selection.

Private Methods

ReturnNameDescription
voidcreateSSLContextCreate a SSL_CTX object according to Context configuration.

createSSLContext

void createSSLContext()

Create a SSL_CTX object according to Context configuration.