Class SecurityEnhancedTLSSocketFactory
- All Implemented Interfaces:
org.apache.http.conn.socket.ConnectionSocketFactory
,org.apache.http.conn.socket.LayeredConnectionSocketFactory
LayeredConnectionSocketFactory
.
This implementation wraps an existing TLS socket factory instance, decorating it with additional support for:
- Loading and clearing thread-local instances of
TrustEngine
<
Credential
>
andCriteriaSet
used for server TLS. - Loading and clearing a thread-local instance of
X509Credential
used for client TLS.
The context keys used by this component are as follows, defined in HttpClientSecurityConstants
:
HttpClientSecurityConstants.CONTEXT_KEY_TRUST_ENGINE
: The trust engine instance used. Supplied by the HttpClient caller. Must be an instance ofTrustEngine
<
Credential
>
.HttpClientSecurityConstants.CONTEXT_KEY_CRITERIA_SET
: The criteria set instance used. Supplied by the HttpClient caller. Must be an instance ofCriteriaSet
.HttpClientSecurityConstants.CONTEXT_KEY_SERVER_TLS_CREDENTIAL_TRUSTED
: The result of the trust evaluation, if it was performed. Populated by this component. Will be aBoolean
, wheretrue
means the server TLS was evaluated as trusted,false
means the credential was evaluated as untrusted. A null or missing value means that trust engine evaluation was not performed.HttpClientSecurityConstants.CONTEXT_KEY_CLIENT_TLS_CREDENTIAL
: The client TLS credential used. Supplied by the HttpClient caller. Must be an instance ofX509Credential
.
Support for server TLS via trust engine evaluation requires use of a compatible TrustManager
implementation configured in the
SSLContext
of the wrapped LayeredConnectionSocketFactory
, such as
ThreadLocalX509TrustManager
.
Support for client TLS requires use of a compatible KeyManager
implementation configured in the
SSLContext
of the wrapped LayeredConnectionSocketFactory
, such as
ThreadLocalX509CredentialKeyManager
.
If the trust engine context attribute is not populated by the caller, then no server TLS thread-local
data is populated. If the wrapped socket factory's X509TrustManager
implementation requires
this data (for example ThreadLocalX509TrustManager
), then a fatal exception is expected to be thrown.
If the client TLS credential context attribute is not populated by the caller, then no client TLS thread-local data is populated, and client TLS will not be attempted.
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final ThreadLocalClientTLSCredentialHandler
Instance ofThreadLocalClientTLSCredentialHandler
to use.private final org.slf4j.Logger
Logger.private static final ThreadLocalServerTLSHandler
Instance ofThreadLocalClientTLSCredentialHandler
to use.private org.apache.http.conn.socket.LayeredConnectionSocketFactory
The HttpClient socket factory instance wrapped by this implementation. -
Constructor Summary
ConstructorsConstructorDescriptionSecurityEnhancedTLSSocketFactory
(org.apache.http.conn.socket.LayeredConnectionSocketFactory factory) Constructor. -
Method Summary
Modifier and TypeMethodDescriptionprotected void
checkAndEvaluateServerTLS
(Socket socket) Check that the evaluation of the socket certificate using the data inThreadLocalX509TrustEngineContext
has been performed, if applicable, and if not, evaluate it.connectSocket
(int connectTimeout, Socket sock, org.apache.http.HttpHost host, InetSocketAddress remoteAddress, InetSocketAddress localAddress, org.apache.http.protocol.HttpContext context) createLayeredSocket
(Socket socket, String target, int port, org.apache.http.protocol.HttpContext context) createSocket
(org.apache.http.protocol.HttpContext context) protected void
Setup calling execution environment for server TLS and client TLS based on information supplied in theHttpContext
.protected void
setupClientTLS
(org.apache.http.protocol.HttpContext context) Setup thread-local data for server TLS and client TLS based on information supplied in theHttpContext
.protected void
setupServerTLS
(org.apache.http.protocol.HttpContext context, String hostname) Setup thread-local data for server TLS.protected void
teardown
(org.apache.http.protocol.HttpContext context) Schedule the deferred clearing of theThreadLocalX509CredentialContext
of the client TLS credential obtained from theHttpContext
.
-
Field Details
-
SERVER_TLS_HANDLER
Instance ofThreadLocalClientTLSCredentialHandler
to use. -
CLIENT_TLS_HANDLER
Instance ofThreadLocalClientTLSCredentialHandler
to use. -
log
private final org.slf4j.Logger logLogger. -
wrappedFactory
@Nonnull private org.apache.http.conn.socket.LayeredConnectionSocketFactory wrappedFactoryThe HttpClient socket factory instance wrapped by this implementation.
-
-
Constructor Details
-
SecurityEnhancedTLSSocketFactory
public SecurityEnhancedTLSSocketFactory(@Nonnull org.apache.http.conn.socket.LayeredConnectionSocketFactory factory) Constructor.- Parameters:
factory
- the underlying HttpClient socket factory wrapped by this implementation.
-
-
Method Details
-
createSocket
- Specified by:
createSocket
in interfaceorg.apache.http.conn.socket.ConnectionSocketFactory
- Throws:
IOException
-
connectSocket
public Socket connectSocket(int connectTimeout, Socket sock, org.apache.http.HttpHost host, InetSocketAddress remoteAddress, InetSocketAddress localAddress, org.apache.http.protocol.HttpContext context) throws IOException - Specified by:
connectSocket
in interfaceorg.apache.http.conn.socket.ConnectionSocketFactory
- Throws:
IOException
-
createLayeredSocket
public Socket createLayeredSocket(Socket socket, String target, int port, org.apache.http.protocol.HttpContext context) throws IOException - Specified by:
createLayeredSocket
in interfaceorg.apache.http.conn.socket.LayeredConnectionSocketFactory
- Throws:
IOException
-
checkAndEvaluateServerTLS
Check that the evaluation of the socket certificate using the data inThreadLocalX509TrustEngineContext
has been performed, if applicable, and if not, evaluate it.This will usually be called only in the case of TLS session resumption, when the standard JSSE trust manager evaluation has not run.
- Parameters:
socket
- the current socket being evaluated- Throws:
IOException
-
setup
protected void setup(@Nullable org.apache.http.protocol.HttpContext context, @Nonnull String hostname) throws SSLPeerUnverifiedException Setup calling execution environment for server TLS and client TLS based on information supplied in theHttpContext
.- Parameters:
context
- the HttpContext instancehostname
- the hostname for the connection- Throws:
SSLPeerUnverifiedException
- if required data is not available from the context
-
setupClientTLS
protected void setupClientTLS(@Nonnull org.apache.http.protocol.HttpContext context) Setup thread-local data for server TLS and client TLS based on information supplied in theHttpContext
.- Parameters:
context
- the HttpContext instance
-
setupServerTLS
protected void setupServerTLS(@Nonnull org.apache.http.protocol.HttpContext context, @Nonnull String hostname) Setup thread-local data for server TLS.- Parameters:
context
- the HttpContext instancehostname
- the hostname for the connection
-
teardown
protected void teardown(@Nullable org.apache.http.protocol.HttpContext context) Schedule the deferred clearing of theThreadLocalX509CredentialContext
of the client TLS credential obtained from theHttpContext
.- Parameters:
context
- the HttpContext instance
-