blob: 295ad0a67378f6d6e1c1e3014f03272da95d7e68 [file] [log] [blame]
= JSSE Utility
The JSSE Utility allows you to easily configure aspects of the
https://docs.oracle.com/en/java/javase/11/security/java-secure-socket-extension-jsse-reference-guide.html[Java
Secure Socket Extension] (JSSE) API in order to greatly simplify the use
of custom transport layer security (TLS) settings on Camel components.
== Supported JSSE Components
A number of Camel components support this (such as but not limited to):
* xref:components::cometd-component.adoc[Cometd]
* xref:components::http-component.adoc[HTTP]
* xref:components::irc-component.adoc[IRC]
* xref:components::jetty-component.adoc[Jetty]
* xref:components::netty-component.adoc[Netty]
* xref:components::mail-component.adoc[Mail]
== Configuring JSSE with Camel
The key component in configuring TLS through the JSSE API is the `SSLContext`.
The `SSLContext` provides socket factories for both client side and server side sockets
as well as another component called an `SSLEngine` that is used by non-blocking IO to support TLS.
The JSSE configuration utility provides an easy-to-use builder for configuring
these JSSE components, among others, in a manner that allows you to provide all
configuration options up front during the initialization of your
application such that you don't have to customize library code or dig
though the inner workings of a third-party library in order to inject
hooks for the configuration of each component in the JSSE API. The
central builder in the JSSE configuration utility is the
SSLContextParameters. This class serves as the entry point for most
configuration in the JSSE utility.
=== SSLContextParameters
`SSLContextParameters` (`<sslContextParameters>` XML tag)
contain the following elements:
* provider (attribute)
* secureSocketProtocol (attribute)
* certAlias (attribute)
* sessionTimeout (attribute)
* cipherSuites (element)
* cipherSuitesFilter (element)
* secureSocketProtocols (element)
* secureSocketProtocolsFilter (element)
* keyManagers (element)
* trustManagers (element)
* secureRandom (element)
* clientParameters (element)
* serverParameters (element)
provider::
The optional provider identifier for the JSSE implementation to use when
constructing the SSLContext. If omitted, the standard provider look-up
mechanism is used to resolve the provider.
secureSocketProtocol::
The optional secure socket protocol. See https://docs.oracle.com/en/java/javase/11/docs/specs/security/standard-names.html[Java Security Standard Algorithm Names]
for information about standard protocol names. If omitted, TLS is used by default.
Note that this property is related to but distinctly different from the
secureSocketProtocols and secureSocketProtocolsFilter properties.
certAlias::
An optional certificate alias to use. This is useful when
the keystore has multiple certificates.
sessionTimeout::
This optional property defines the timeout period, in seconds, for
sessions on both the client and server side as well as in the SSLEngine.
cipherSuites::
This optional property represents a collection of explicitly named
cipher suites to enable on both the client and server side as well as in
the SSLEngine. These values take precedence over filters supplied in
cipherSuitesFilter. The utility attempts to enable the listed cipher
suites regardless of whether the JSSE provider actually supports
them or not. This behavior guarantees that listed cipher suites are
always enabled when listed. For a more lenient option, use
cipherSuitesFilter.
cipherSuitesFilter::
This optional property represents a collection of include and exclude
patterns for cipher suites to enable on both the client and server side
as well as in the SSLEngine. The patterns are applied over only the
available cipher suites. The excludes patterns have precedence over the
includes patterns. If no cipherSuites and no cipherSuitesFilter are
present, the default patterns applied are:
[source,text]
----
Includes .\*;
Excludes .*_NULL_.*, .\*_anon_.*, .\*DES.*, .\*EXPORT.*, .\*MD5, .*RC4.*
----
secureSocketProtocols::
This optional property represents a collection of explicitly named
secure socket protocols, such as SSLv3/TLS/etc., to enable on both the
client and server side as well as in the SSLEngine. These values take
precedence over filters supplied in secureSocketProtocolsFilter. The
utility attempts to enable the listed protocols regardless of whether
the JSSE provider actually supports them or not. This behavior
guarantees that listed protocols are always enabled when listed. For a
more lenient option, use secureSocketProtocolsFilter.
secureSocketProtocolsFilter::
This optional property represents a collection of include and exclude
patterns for secure socket protocols to enable on both the client and
server side as well as in the SSLEngine. The patterns are applied over
only the available protocols. The excludes patterns have precedence over
the includes patterns. If no secureSocketProtocols and no
secureSocketProtocolsFilter are present, the default patterns applied
are:
[source,text]
----
Includes .*
----
keyManagers::
This optional property configures the source of key material for
providing identity of client and server side connections as well as in
the SSLEngine. If omitted, no source of key material is provided and
the SSLContext is suitable only for client-side usage when mutual
authentication is not in use. You typically configure this property
with a key store containing a client or server private key.
trustManagers::
This optional property configures the source of material for verifying
trust of key material used in the handshake process. If omitted, the
default trust manager is automatically used. See the
https://docs.oracle.com/en/java/javase/11/security/java-secure-socket-extension-jsse-reference-guide.html#GUID-7D9F43B8-AABF-4C5B-93E6-3AFB18B66150[JSSE
documentation] for more information on how the default trust manager is
configured. You typically configure this property with a key store
containing trusted CA certificates.
secureRandom::
This optional property configures the secure random number generator
used by the client and server side as well as in the SSLEngine. If
omitted, the default secure random number generator is used.
clientParameters::
This optional property configures additional settings that apply only to
the client side aspects of the SSLContext. If present, these settings
override the settings specified at the SSLContextParameters level.
serverParameters::
This optional property configures additional settings that apply only to
the server side aspects of the SSLContext. If present, these settings
override the settings specified at the SSLContextParameters level.
=== KeyManagersParameters
KeyManagersParameters contain the following elements:
* keyPassword (attribute)
* provider (attribute)
* algorithm (attribute)
* keyStore (element)
keyPassword::
The optional password for recovering/accessing the private key in the
key store. This is typically the password for the private key in the
configured key store; however, in some cases, such as when using
PKCS#11, the key password may be provided through other means and is
omitted entirely in this configuration.
provider::
The optional provider identifier for the KeyManagerFactory used to
create the KeyManagers represented by this object's configuration. If
omitted, the default look-up behavior is used.
algorithm::
The optional algorithm name for the KeyManagerFactory used to create the
KeyManager represented by this object's configuration. See the
https://docs.oracle.com/en/java/javase/11/security/java-secure-socket-extension-jsse-reference-guide.html[Java
Secure Socket Extension Reference Guide] for information about standard
algorithm names.
keyStore::
This optional property represents the key store that provides key
material to the key manager. This is typically configured with a key
store containing a user or server private key. In some cases, such as
when using PKCS#11, the key store is omitted entirely.
=== TrustManagersParameters
TrustManagersParameters contain the following elements:
* provider (attribute)
* algorithm (attribute)
* trustManager (attribute)
* keyStore (element)
provider::
The optional provider identifier for the TrustManagerFactory used to
create the TrustManagers represented by this object's configuration. If
omitted, the default look-up behavior is used.
algorithm::
The optional algorithm name for the TrustManagerFactory used to create
the TrustManager represented by this object's configuration. See the
https://docs.oracle.com/en/java/javase/11/security/java-secure-socket-extension-jsse-reference-guide.html[Java
Secure Socket Extension Reference Guide] for information about standard
algorithm names.
trustManager::
To use an existing configured trust manager instead of using
TrustManagerFactory to get the TrustManager.
keyStore::
See <<CamelConfigurationUtilities-KeyStoreParameters>>.
This optional property represents the key store that provides key
material to the trust manager. This is typically configured with a key
store containing trusted CA certificates / public keys. In some cases,
such as when using PKCS#11, the key store is omitted entirely.
[[CamelConfigurationUtilities-KeyStoreParameters]]
=== KeyStoreParameters
KeyStoreParameters contain the following elements:
* type (attribute)
* password (attribute)
* provider (attribute)
* resource (attribute)
type::
The optional type of the key store. See the
https://docs.oracle.com/en/java/javase/11/docs/specs/security/standard-names.html[Java Security Standard Algorithm Names]
for more information on standard names. If omitted, defaults to the default
lookup mechanism as defined by `KeyStore.getDefaultType()`
password::
The optional password for reading/opening/verifying the key store.
provider::
The optional provider identifier for the provider used to create the
KeyStores represented by this object's configuration. If omitted, the
default look-up behavior is used.
resource::
Optional property to load the key store resource from a uri. By default the class path is used, otherwise
the uri needs to be specified. For example to use file path as a resource, the prefix file is needed (file:/path/to/keystore).
In some cases, the resource is omitted as the key store is provided by other means.
=== FilterParameters
FilterParameters contain the following elements:
* include (element, multiple string)
* exclude (element, multiple string)
include::
This optional property represents zero or more regular expression
patterns for which matching values should be included. The list of
excludes takes precedence over the includes patterns.
exclude::
This optional property represents zero or more regular expression
patterns for which matching values should be included. The list of
excludes takes precedence over the includes patterns.
=== SecureRandomParameters
SecureRandomParameters contain the following elements:
* algorithm (attribute)
* provider (attribute)
algorithm::
This optional property represents the Random Number Generator (RNG)
algorithm identifier for the SecureRandom factory method used to create
the SecureRandom represented by this object's configuration. See
https://docs.oracle.com/en/java/javase/11/docs/specs/security/standard-names.html[Java Security Standard Algorithm Names]
for information about standard RNG algorithm names.
provider::
The optional provider identifier for the SecureRandom factory method
used to create the SecureRandom represented by this object's
configuration. If omitted, the default look-up behavior is used.
=== SSLContextServerParameters
SSLContextServerParameters contain the following elements:
* clientAuthentication (attribute)
* sessionTimeout (attribute)
* cipherSuites (element)
* cipherSuitesFilter (element)
* secureSocketProtocols (element)
* secureSocketProtocolsFilter (element)
clientAuthentication::
This optional property indicates if the server side does not request,
requests, or requires clients to provide authentication credentials
during the handshake process. This is commonly referred to as mutual
authentication, two direction SSL/TLS, or two-legged SSL/TLS.
Valid values are: NONE, WANT, REQUIRE
sessionTimeout::
This optional property defines the timeout period, in seconds, for
sessions on the server side. This setting affects both the
SSLServerSocketFactory/SSLServerSocket and the server side of the
SSLEngine.
cipherSuites::
This optional property overrides the value of this
setting in the SSLContextParameters. This option has no effect on the
SSLEngine configuration.
cipherSuitesFilter::
This optional property overrides the value of this
setting in the SSLContextParameters. This option has no effect on the
SSLEngine configuration.
secureSocketProtocols::
This optional property overrides the
value of this setting in the SSLContextParameters. This option has no
effect on the SSLEngine configuration.
secureSocketProtocolsFilter::
This optional property overrides the value of this
setting in the SSLContextParameters. This option has no effect on the
SSLEngine configuration.
=== SSLContextClientParameters
SSLContextClientParameters contains the following elements:
* sniHostNames (elements)
* sessionTimeout (attribute)
* cipherSuites (element)
* cipherSuitesFilter (element)
* secureSocketProtocols (element)
* secureSocketProtocolsFilter (element)
sniHostNames::
Contains a list of sniHostName elements which provides a list
of SNIHostNames to be used for SSL.
sessionTimeout::
See above
cipherSuites::
See above
cipherSuitesFilter::
See above
secureSocketProtocols::
See above
secureSocketProtocolsFilter::
See above
== Examples
=== Setting Client Authentication on the Server Side
This configuration sets the server side aspects of the TLS configuration
to require client authentication during the handshake process. This
configuration uses the default trust store and a custom key store to
provide key material for both the server and client sides of the
SSLContext.
[source,java]
-------------------------------------------------------------------
KeyStoreParameters ksp = new KeyStoreParameters();
ksp.setResource("file:/users/home/server/keystore.jks");
ksp.setPassword("keystorePassword");
KeyManagersParameters kmp = new KeyManagersParameters();
kmp.setKeyStore(ksp);
kmp.setKeyPassword("keyPassword");
SSLContextServerParameters scsp = new SSLContextServerParameters();
scsp.setClientAuthentication(ClientAuthentication.REQUIRE);
SSLContextParameters scp = new SSLContextParameters();
scp.setServerParameters(scsp);
scp.setKeyManagers(kmp);
SSLContext context = scp.createSSLContext();
SSLEngine engine = scp.createSSLEngine();
-------------------------------------------------------------------
== Configuring Different Options on the Client and Server Side
In this example, both the client and server sides share the same custom
key store; however, the client side allows any supported cipher suite
while the server side will use the default cipher suite filter and
exclude any cipher suites that match the patterns:
[source,text]
----
.*_NULL_.*
.*_anon_.*
----
[source,java]
-------------------------------------------------------------------
KeyStoreParameters ksp = new KeyStoreParameters();
ksp.setResource("file:/users/home/server/keystore.jks");
ksp.setPassword("keystorePassword");
KeyManagersParameters kmp = new KeyManagersParameters();
kmp.setKeyStore(ksp);
kmp.setKeyPassword("keyPassword");
FilterParameters filter = new FilterParameters();
filter.getInclude().add(".*");
SSLContextClientParameters sccp = new SSLContextClientParameters();
sccp.setCipherSuitesFilter(filter);
SSLContextParameters scp = new SSLContextParameters();
scp.setClientParameters(sccp);
scp.setKeyManagers(kmp);
SSLContext context = scp.createSSLContext();
SSLEngine engine = scp.createSSLEngine();
-------------------------------------------------------------------