Class SecurityEnhancedTLSSocketFactory
- All Implemented Interfaces:
org.apache.hc.client5.http.socket.ConnectionSocketFactory,org.apache.hc.client5.http.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>andCriteriaSetused for server TLS. - Loading and clearing a thread-local instance of
X509Credentialused 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, wheretruemeans the server TLS was evaluated as trusted,falsemeans 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 ThreadLocalClientTLSCredentialHandlerInstance ofThreadLocalClientTLSCredentialHandlerto use.private final org.slf4j.LoggerLogger.private static final ThreadLocalServerTLSHandlerInstance ofThreadLocalClientTLSCredentialHandlerto use.private org.apache.hc.client5.http.socket.LayeredConnectionSocketFactoryThe HttpClient socket factory instance wrapped by this implementation. -
Constructor Summary
ConstructorsConstructorDescriptionSecurityEnhancedTLSSocketFactory(org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory factory) Constructor. -
Method Summary
Modifier and TypeMethodDescriptionprotected voidcheckAndEvaluateServerTLS(Socket socket) Check that the evaluation of the socket certificate using the data inThreadLocalX509TrustEngineContexthas been performed, if applicable, and if not, evaluate it.connectSocket(org.apache.hc.core5.util.TimeValue connectTimeout, Socket sock, org.apache.hc.core5.http.HttpHost host, InetSocketAddress remoteAddress, InetSocketAddress localAddress, org.apache.hc.core5.http.protocol.HttpContext context) createLayeredSocket(Socket socket, String target, int port, org.apache.hc.core5.http.protocol.HttpContext context) createSocket(org.apache.hc.core5.http.protocol.HttpContext context) protected voidSetup calling execution environment for server TLS and client TLS based on information supplied in theHttpContext.protected voidsetupClientTLS(org.apache.hc.core5.http.protocol.HttpContext context) Setup thread-local data for server TLS and client TLS based on information supplied in theHttpContext.protected voidsetupServerTLS(org.apache.hc.core5.http.protocol.HttpContext context, String hostname) Setup thread-local data for server TLS.protected voidteardown(org.apache.hc.core5.http.protocol.HttpContext context) Schedule the deferred clearing of theThreadLocalX509CredentialContextof the client TLS credential obtained from theHttpContext.Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface org.apache.hc.client5.http.socket.ConnectionSocketFactory
connectSocket, createSocketMethods inherited from interface org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory
createLayeredSocket
-
Field Details
-
SERVER_TLS_HANDLER
Instance ofThreadLocalClientTLSCredentialHandlerto use. -
CLIENT_TLS_HANDLER
Instance ofThreadLocalClientTLSCredentialHandlerto use. -
log
@Nonnull private final org.slf4j.Logger logLogger. -
wrappedFactory
@Nonnull private org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory wrappedFactoryThe HttpClient socket factory instance wrapped by this implementation.
-
-
Constructor Details
-
SecurityEnhancedTLSSocketFactory
public SecurityEnhancedTLSSocketFactory(@Nonnull org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory factory) Constructor.- Parameters:
factory- the underlying HttpClient socket factory wrapped by this implementation.
-
-
Method Details
-
createSocket
public Socket createSocket(org.apache.hc.core5.http.protocol.HttpContext context) throws IOException - Specified by:
createSocketin interfaceorg.apache.hc.client5.http.socket.ConnectionSocketFactory- Throws:
IOException
-
connectSocket
public Socket connectSocket(org.apache.hc.core5.util.TimeValue connectTimeout, Socket sock, org.apache.hc.core5.http.HttpHost host, InetSocketAddress remoteAddress, InetSocketAddress localAddress, org.apache.hc.core5.http.protocol.HttpContext context) throws IOException - Specified by:
connectSocketin interfaceorg.apache.hc.client5.http.socket.ConnectionSocketFactory- Throws:
IOException
-
createLayeredSocket
public Socket createLayeredSocket(Socket socket, String target, int port, org.apache.hc.core5.http.protocol.HttpContext context) throws IOException - Specified by:
createLayeredSocketin interfaceorg.apache.hc.client5.http.socket.LayeredConnectionSocketFactory- Throws:
IOException
-
checkAndEvaluateServerTLS
Check that the evaluation of the socket certificate using the data inThreadLocalX509TrustEngineContexthas 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- if the certificate chain was not trusted by the supplied TrustEngine
-
setup
protected void setup(@Nullable org.apache.hc.core5.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.hc.core5.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.hc.core5.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.hc.core5.http.protocol.HttpContext context) Schedule the deferred clearing of theThreadLocalX509CredentialContextof the client TLS credential obtained from theHttpContext.- Parameters:
context- the HttpContext instance
-