123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405 |
- //
- // Context.h
- //
- // Library: NetSSL_OpenSSL
- // Package: SSLCore
- // Module: Context
- //
- // Definition of the Context class.
- //
- // Copyright (c) 2006-2010, Applied Informatics Software Engineering GmbH.
- // and Contributors.
- //
- // SPDX-License-Identifier: BSL-1.0
- //
- #ifndef NetSSL_Context_INCLUDED
- #define NetSSL_Context_INCLUDED
- #include "Poco/Net/NetSSL.h"
- #include "Poco/Net/SocketDefs.h"
- #include "Poco/Crypto/X509Certificate.h"
- #include "Poco/Crypto/RSAKey.h"
- #include "Poco/RefCountedObject.h"
- #include "Poco/AutoPtr.h"
- #include <openssl/ssl.h>
- #include <cstdlib>
- namespace Poco {
- namespace Net {
- class NetSSL_API Context: public Poco::RefCountedObject
- /// 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:
- typedef Poco::AutoPtr<Context> Ptr;
- enum Usage
- {
- CLIENT_USE, /// Context is used by a client.
- SERVER_USE, /// Context is used by a server.
- TLSV1_CLIENT_USE, /// Context is used by a client requiring TLSv1.
- TLSV1_SERVER_USE, /// Context is used by a server requiring TLSv1.
- TLSV1_1_CLIENT_USE, /// Context is used by a client requiring TLSv1.1 (OpenSSL 1.0.0 or newer).
- TLSV1_1_SERVER_USE, /// Context is used by a server requiring TLSv1.1 (OpenSSL 1.0.0 or newer).
- TLSV1_2_CLIENT_USE, /// Context is used by a client requiring TLSv1.2 (OpenSSL 1.0.1 or newer).
- TLSV1_2_SERVER_USE /// Context is used by a server requiring TLSv1.2 (OpenSSL 1.0.1 or newer).
- };
- enum VerificationMode
- {
- VERIFY_NONE = SSL_VERIFY_NONE,
- /// Server: The server will not send a client certificate
- /// request to the client, so the client will not send a certificate.
- ///
- /// Client: If not using an anonymous cipher (by default disabled),
- /// the server will send a certificate which will be checked, but
- /// the result of the check will be ignored.
- VERIFY_RELAXED = SSL_VERIFY_PEER,
- /// Server: 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.
- ///
- /// Client: The server certificate is verified, if one is provided.
- /// If the verification process fails, the TLS/SSL handshake is
- /// immediately terminated with an alert message containing the
- /// reason for the verification failure.
- VERIFY_STRICT = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
- /// Server: If the client did not return a certificate, the TLS/SSL
- /// handshake is immediately terminated with a handshake failure
- /// alert.
- ///
- /// Client: Same as VERIFY_RELAXED.
- VERIFY_ONCE = SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE
- /// Server: Only request a client certificate on the initial
- /// TLS/SSL handshake. Do not ask for a client certificate
- /// again in case of a renegotiation.
- ///
- /// Client: Same as VERIFY_RELAXED.
- };
- enum Protocols
- {
- PROTO_SSLV2 = 0x01,
- PROTO_SSLV3 = 0x02,
- PROTO_TLSV1 = 0x04,
- PROTO_TLSV1_1 = 0x08,
- PROTO_TLSV1_2 = 0x10
- };
- struct NetSSL_API Params
- {
- Params();
- /// Initializes the struct with default values.
- std::string privateKeyFile;
- /// Path to the private key file used for encryption.
- /// Can be empty if no private key file is used.
- std::string certificateFile;
- /// 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.
- std::string caLocation;
- /// 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 verificationMode;
- /// Specifies whether and how peer certificates are validated.
- /// Defaults to VERIFY_RELAXED.
- int verificationDepth;
- /// Sets the upper limit for verification chain sizes. Verification
- /// will fail if a certificate chain larger than this is encountered.
- /// Defaults to 9.
- bool loadDefaultCAs;
- /// Specifies whether the builtin CA certificates from OpenSSL are used.
- /// Defaults to false.
- std::string cipherList;
- /// Specifies the supported ciphers in OpenSSL notation.
- /// Defaults to "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH".
- std::string dhParamsFile;
- /// Specifies a file containing Diffie-Hellman parameters.
- /// If empty, the default parameters are used.
- std::string ecdhCurve;
- /// Specifies the name of the curve to use for ECDH, based
- /// on the curve names specified in RFC 4492.
- /// Defaults to "prime256v1".
- };
- Context(Usage usage, const Params& params);
- /// Creates a Context using the given parameters.
- ///
- /// * usage specifies whether the context is used by a client or server.
- /// * params specifies the context parameters.
- Context(
- Usage usage,
- const std::string& privateKeyFile,
- const std::string& certificateFile,
- const std::string& caLocation,
- VerificationMode verificationMode = VERIFY_RELAXED,
- int verificationDepth = 9,
- bool loadDefaultCAs = false,
- const std::string& cipherList = "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
- /// 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.
- Context(
- Usage usage,
- const std::string& caLocation,
- VerificationMode verificationMode = VERIFY_RELAXED,
- int verificationDepth = 9,
- bool loadDefaultCAs = false,
- const std::string& cipherList = "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
- /// 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.
- ~Context();
- /// Destroys the Context.
- void useCertificate(const Poco::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().
- void addChainCertificate(const Poco::Crypto::X509Certificate& certificate);
- /// Adds a certificate for certificate chain validation.
- void addCertificateAuthority(const Poco::Crypto::X509Certificate& certificate);
- /// Add one trusted certification authority to be used by the Context.
- void usePrivateKey(const Poco::Crypto::RSAKey& key);
- /// 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.
- SSL_CTX* sslContext() const;
- /// Returns the underlying OpenSSL SSL Context object.
- Usage usage() const;
- /// Returns whether the context is for use by a client or by a server
- /// and whether TLSv1 is required.
- bool isForServerUse() const;
- /// Returns true iff the context is for use by a server.
- Context::VerificationMode verificationMode() const;
- /// Returns the verification mode.
- void enableSessionCache(bool flag = true);
- /// 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.
- void enableSessionCache(bool flag, const std::string& 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.
- bool sessionCacheEnabled() const;
- /// Returns true iff the session cache is enabled.
- void setSessionCacheSize(std::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.
- std::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.
- 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.
- 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.
- void flushSessionCache();
- /// Flushes the SSL session cache on the server.
- ///
- /// This method may only be called on SERVER_USE Context objects.
- void enableExtendedCertificateVerification(bool flag = true);
- /// Enable or disable the automatic post-connection
- /// extended certificate verification.
- ///
- /// See X509Certificate::verify() for more information.
- bool extendedCertificateVerificationEnabled() const;
- /// Returns true iff automatic extended certificate
- /// verification is enabled.
- void disableStatelessSessionResumption();
- /// Newer versions of OpenSSL support RFC 4507 tickets for stateless
- /// session resumption.
- ///
- /// 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);
- void preferServerCiphers();
- /// When choosing a cipher, use the server's preferences instead of the client
- /// preferences. When not called, the SSL server will always follow the clients
- /// preferences. When called, the SSL/TLS server will choose following its own
- /// preferences.
- private:
- void init(const Params& params);
- /// Initializes the Context with the given parameters.
- void initDH(const std::string& dhFile);
- /// Initializes the Context with Diffie-Hellman parameters.
- void initECDH(const std::string& curve);
- /// Initializes the Context with Elliptic-Curve Diffie-Hellman key
- /// exchange curve parameters.
- void createSSLContext();
- /// Create a SSL_CTX object according to Context configuration.
- Usage _usage;
- VerificationMode _mode;
- SSL_CTX* _pSSLContext;
- bool _extendedCertificateVerification;
- };
- //
- // inlines
- //
- inline Context::Usage Context::usage() const
- {
- return _usage;
- }
- inline bool Context::isForServerUse() const
- {
- return _usage == SERVER_USE
- || _usage == TLSV1_SERVER_USE
- || _usage == TLSV1_1_SERVER_USE
- || _usage == TLSV1_2_SERVER_USE;
- }
- inline Context::VerificationMode Context::verificationMode() const
- {
- return _mode;
- }
- inline SSL_CTX* Context::sslContext() const
- {
- return _pSSLContext;
- }
- inline bool Context::extendedCertificateVerificationEnabled() const
- {
- return _extendedCertificateVerification;
- }
- } } // namespace Poco::Net
- #endif // NetSSL_Context_INCLUDED
|