Class SSLConnectionSocketFactory
- java.lang.Object
-
- org.apache.http.conn.ssl.SSLConnectionSocketFactory
-
- All Implemented Interfaces:
ConnectionSocketFactory
,LayeredConnectionSocketFactory
@Contract(threading=SAFE) public class SSLConnectionSocketFactory extends java.lang.Object implements LayeredConnectionSocketFactory
Layered socket factory for TLS/SSL connections.SSLSocketFactory can be used to validate the identity of the HTTPS server against a list of trusted certificates and to authenticate to the HTTPS server using a private key.
SSLSocketFactory will enable server authentication when supplied with a
trust-store
file containing one or several trusted certificates. The client secure socket will reject the connection during the SSL session handshake if the target HTTPS server attempts to authenticate itself with a non-trusted certificate.Use JDK keytool utility to import a trusted certificate and generate a trust-store file:
keytool -import -alias "my server cert" -file server.crt -keystore my.truststore
In special cases the standard trust verification process can be bypassed by using a custom
TrustStrategy
. This interface is primarily intended for allowing self-signed certificates to be accepted as trusted without having to add them to the trust-store file.SSLSocketFactory will enable client authentication when supplied with a
key-store
file containing a private key/public certificate pair. The client secure socket will use the private key to authenticate itself to the target HTTPS server during the SSL session handshake if requested to do so by the server. The target HTTPS server will in its turn verify the certificate presented by the client in order to establish client's authenticity.Use the following sequence of actions to generate a key-store file
-
Use JDK keytool utility to generate a new key
keytool -genkey -v -alias "my client key" -validity 365 -keystore my.keystore
For simplicity use the same password for the key as that of the key-store
-
Issue a certificate signing request (CSR)
keytool -certreq -alias "my client key" -file mycertreq.csr -keystore my.keystore
-
Send the certificate request to the trusted Certificate Authority for signature. One may choose to act as her own CA and sign the certificate request using a PKI tool, such as OpenSSL.
-
Import the trusted CA root certificate
keytool -import -alias "my trusted ca" -file caroot.crt -keystore my.keystore
-
Import the PKCS#7 file containing the complete certificate chain
keytool -import -alias "my client key" -file mycert.p7 -keystore my.keystore
-
Verify the content of the resultant keystore file
keytool -list -v -keystore my.keystore
- Since:
- 4.3
-
-
Field Summary
Fields Modifier and Type Field Description static X509HostnameVerifier
ALLOW_ALL_HOSTNAME_VERIFIER
Deprecated.static X509HostnameVerifier
BROWSER_COMPATIBLE_HOSTNAME_VERIFIER
Deprecated.static java.lang.String
SSL
static java.lang.String
SSLV2
static X509HostnameVerifier
STRICT_HOSTNAME_VERIFIER
Deprecated.static java.lang.String
TLS
-
Constructor Summary
Constructors Constructor Description SSLConnectionSocketFactory(javax.net.ssl.SSLContext sslContext)
SSLConnectionSocketFactory(javax.net.ssl.SSLContext sslContext, java.lang.String[] supportedProtocols, java.lang.String[] supportedCipherSuites, javax.net.ssl.HostnameVerifier hostnameVerifier)
SSLConnectionSocketFactory(javax.net.ssl.SSLContext sslContext, java.lang.String[] supportedProtocols, java.lang.String[] supportedCipherSuites, X509HostnameVerifier hostnameVerifier)
SSLConnectionSocketFactory(javax.net.ssl.SSLContext sslContext, javax.net.ssl.HostnameVerifier hostnameVerifier)
SSLConnectionSocketFactory(javax.net.ssl.SSLContext sslContext, X509HostnameVerifier hostnameVerifier)
Deprecated.SSLConnectionSocketFactory(javax.net.ssl.SSLSocketFactory socketfactory, java.lang.String[] supportedProtocols, java.lang.String[] supportedCipherSuites, javax.net.ssl.HostnameVerifier hostnameVerifier)
SSLConnectionSocketFactory(javax.net.ssl.SSLSocketFactory socketfactory, java.lang.String[] supportedProtocols, java.lang.String[] supportedCipherSuites, X509HostnameVerifier hostnameVerifier)
SSLConnectionSocketFactory(javax.net.ssl.SSLSocketFactory socketfactory, javax.net.ssl.HostnameVerifier hostnameVerifier)
SSLConnectionSocketFactory(javax.net.ssl.SSLSocketFactory socketfactory, X509HostnameVerifier hostnameVerifier)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description java.net.Socket
connectSocket(int connectTimeout, java.net.Socket socket, HttpHost host, java.net.InetSocketAddress remoteAddress, java.net.InetSocketAddress localAddress, HttpContext context)
Connects the socket to the target host with the given resolved remote address.java.net.Socket
createLayeredSocket(java.net.Socket socket, java.lang.String target, int port, HttpContext context)
Returns a socket connected to the given host that is layered over an existing socket.java.net.Socket
createSocket(HttpContext context)
Creates new, unconnected socket.static javax.net.ssl.HostnameVerifier
getDefaultHostnameVerifier()
static SSLConnectionSocketFactory
getSocketFactory()
Obtains default SSL socket factory with an SSL context based on the standard JSSE trust material (cacerts
file in the security properties directory).static SSLConnectionSocketFactory
getSystemSocketFactory()
Obtains default SSL socket factory with an SSL context based on system properties as described in Java™ Secure Socket Extension (JSSE) Reference Guide.
-
-
-
Field Detail
-
TLS
public static final java.lang.String TLS
- See Also:
- Constant Field Values
-
SSL
public static final java.lang.String SSL
- See Also:
- Constant Field Values
-
SSLV2
public static final java.lang.String SSLV2
- See Also:
- Constant Field Values
-
ALLOW_ALL_HOSTNAME_VERIFIER
@Deprecated public static final X509HostnameVerifier ALLOW_ALL_HOSTNAME_VERIFIER
Deprecated.
-
BROWSER_COMPATIBLE_HOSTNAME_VERIFIER
@Deprecated public static final X509HostnameVerifier BROWSER_COMPATIBLE_HOSTNAME_VERIFIER
Deprecated.
-
STRICT_HOSTNAME_VERIFIER
@Deprecated public static final X509HostnameVerifier STRICT_HOSTNAME_VERIFIER
Deprecated.
-
-
Constructor Detail
-
SSLConnectionSocketFactory
public SSLConnectionSocketFactory(javax.net.ssl.SSLContext sslContext)
-
SSLConnectionSocketFactory
@Deprecated public SSLConnectionSocketFactory(javax.net.ssl.SSLContext sslContext, X509HostnameVerifier hostnameVerifier)
Deprecated.
-
SSLConnectionSocketFactory
@Deprecated public SSLConnectionSocketFactory(javax.net.ssl.SSLContext sslContext, java.lang.String[] supportedProtocols, java.lang.String[] supportedCipherSuites, X509HostnameVerifier hostnameVerifier)
-
SSLConnectionSocketFactory
@Deprecated public SSLConnectionSocketFactory(javax.net.ssl.SSLSocketFactory socketfactory, X509HostnameVerifier hostnameVerifier)
-
SSLConnectionSocketFactory
@Deprecated public SSLConnectionSocketFactory(javax.net.ssl.SSLSocketFactory socketfactory, java.lang.String[] supportedProtocols, java.lang.String[] supportedCipherSuites, X509HostnameVerifier hostnameVerifier)
-
SSLConnectionSocketFactory
public SSLConnectionSocketFactory(javax.net.ssl.SSLContext sslContext, javax.net.ssl.HostnameVerifier hostnameVerifier)
- Since:
- 4.4
-
SSLConnectionSocketFactory
public SSLConnectionSocketFactory(javax.net.ssl.SSLContext sslContext, java.lang.String[] supportedProtocols, java.lang.String[] supportedCipherSuites, javax.net.ssl.HostnameVerifier hostnameVerifier)
- Since:
- 4.4
-
SSLConnectionSocketFactory
public SSLConnectionSocketFactory(javax.net.ssl.SSLSocketFactory socketfactory, javax.net.ssl.HostnameVerifier hostnameVerifier)
- Since:
- 4.4
-
SSLConnectionSocketFactory
public SSLConnectionSocketFactory(javax.net.ssl.SSLSocketFactory socketfactory, java.lang.String[] supportedProtocols, java.lang.String[] supportedCipherSuites, javax.net.ssl.HostnameVerifier hostnameVerifier)
- Since:
- 4.4
-
-
Method Detail
-
getDefaultHostnameVerifier
public static javax.net.ssl.HostnameVerifier getDefaultHostnameVerifier()
- Since:
- 4.4
-
getSocketFactory
public static SSLConnectionSocketFactory getSocketFactory() throws SSLInitializationException
Obtains default SSL socket factory with an SSL context based on the standard JSSE trust material (cacerts
file in the security properties directory). System properties are not taken into consideration.- Returns:
- default SSL socket factory
- Throws:
SSLInitializationException
-
getSystemSocketFactory
public static SSLConnectionSocketFactory getSystemSocketFactory() throws SSLInitializationException
Obtains default SSL socket factory with an SSL context based on system properties as described in Java™ Secure Socket Extension (JSSE) Reference Guide.- Returns:
- default system SSL socket factory
- Throws:
SSLInitializationException
-
createSocket
public java.net.Socket createSocket(HttpContext context) throws java.io.IOException
Description copied from interface:ConnectionSocketFactory
Creates new, unconnected socket. The socket should subsequently be passed toconnectSocket
method.- Specified by:
createSocket
in interfaceConnectionSocketFactory
- Returns:
- a new socket
- Throws:
java.io.IOException
- if an I/O error occurs while creating the socket
-
connectSocket
public java.net.Socket connectSocket(int connectTimeout, java.net.Socket socket, HttpHost host, java.net.InetSocketAddress remoteAddress, java.net.InetSocketAddress localAddress, HttpContext context) throws java.io.IOException
Description copied from interface:ConnectionSocketFactory
Connects the socket to the target host with the given resolved remote address.- Specified by:
connectSocket
in interfaceConnectionSocketFactory
- Parameters:
connectTimeout
- connect timeout.socket
- the socket to connect, as obtained fromConnectionSocketFactory.createSocket(HttpContext)
.null
indicates that a new socket should be created and connected.host
- target host as specified by the caller (end user).remoteAddress
- the resolved remote address to connect to.localAddress
- the local address to bind the socket to, ornull
for any.context
- the actual HTTP context.- Returns:
- the connected socket. The returned object may be different
from the
sock
argument if this factory supports a layered protocol. - Throws:
java.io.IOException
- if an I/O error occurs
-
createLayeredSocket
public java.net.Socket createLayeredSocket(java.net.Socket socket, java.lang.String target, int port, HttpContext context) throws java.io.IOException
Description copied from interface:LayeredConnectionSocketFactory
Returns a socket connected to the given host that is layered over an existing socket. Used primarily for creating secure sockets through proxies.- Specified by:
createLayeredSocket
in interfaceLayeredConnectionSocketFactory
- Parameters:
socket
- the existing sockettarget
- the name of the target host.port
- the port to connect to on the target host.context
- the actual HTTP context.- Returns:
- Socket a new socket
- Throws:
java.io.IOException
- if an I/O error occurs while creating the socket
-
-