Class SOCKSProxySocketFactory

java.lang.Object
javax.net.SocketFactory
com.unboundid.util.SOCKSProxySocketFactory

This class provides an implementation of a socket factory that can be used to forward traffic through a SOCKSv4 or SOCKSv5 proxy server. Because of limitations in the Java support for SOCKS proxy servers, the following constraints will be imposed:
  • Communication with the proxy server itself cannot be encrypted. However, it is possible to encrypt all communication through the proxy server to the actual target server using TLS (by providing an SSLSocketFactory instance when creating the SOCKSProxySocketFactory), in which case the data will still be protected from the client to that target server, and anyone observing the communication between the client and the SOCKS proxy, or between the SOCKS proxy and the target server, would not be able to decipher that communication.
  • This implementation only provides direct support for proxy servers that do not require authentication. Although it may be possible to configure authentication using Java system properties, this implementation does not provide any direct support for authentication.


Example

The following example demonstrates the process for establishing an LDAPS connection through a SOCKS proxy server:
   final String socksProxyServerAddress = "socks-proxy.example.com";
   final int socksProxyServerPort = 1080;
   final int connectTimeoutMillis = 10_000;

   final SSLUtil sslUtil =
        new SSLUtil(new TrustStoreTrustManager("/path/to/trust/store"));
   final SSLSocketFactory ldapsSocketFactory =
        sslUtil.createSSLSocketFactory();

   final SOCKSProxySocketFactory socksProxySocketFactory =
        new SOCKSProxySocketFactory(socksProxyServerAddress,
             socksProxyServerPort, connectTimeoutMillis,
             ldapsSocketFactory);

   final String ldapsServerAddress = "ds.example.com";
   final int ldapsServerPort = 636;

   try (LDAPConnection conn = new LDAPConnection(socksProxySocketFactory,
        ldapsServerAddress, ldapsServerPort))
   {
     // Do something with the connection here.
   }
 
  • Constructor Details

    • SOCKSProxySocketFactory

      public SOCKSProxySocketFactory(@NotNull String socksProxyHost, int socksProxyPort, int connectTimeoutMillis)
      Creates a new instance of this SOCKS socket factory with the provided settings. The resulting socket factory will provide support for unencrypted LDAP communication.
      Parameters:
      socksProxyHost - The address of the SOCKS proxy server. It must not be null.
      socksProxyPort - The port on which the SOCKS proxy is listening for new connections.
      connectTimeoutMillis - The maximum length of time in milliseconds to wait for a connection to be established. A value that is less than or equal to zero indicates that no explicit timeout will be imposed.
    • SOCKSProxySocketFactory

      public SOCKSProxySocketFactory(@NotNull String socksProxyHost, int socksProxyPort, int connectTimeoutMillis, @Nullable SSLSocketFactory sslSocketFactory)
      Creates a new instance of this SOCKS socket factory with the provided settings. The resulting socket factory may provide support for either unencrypted LDAP communication (if the provided sslSocketFactory value is null) or encrypted LDAPS communication (if the provided sslSocketFactory value is non-null).
      Parameters:
      socksProxyHost - The address of the SOCKS proxy server. It must not be null.
      socksProxyPort - The port on which the SOCKS proxy is listening for new connections.
      connectTimeoutMillis - The maximum length of time in milliseconds to wait for a connection to be established. A value that is less than or equal to zero indicates that no explicit timeout will be imposed.
      sslSocketFactory - An SSL socket factory that should be used if communication with the target LDAP server should be encrypted with TLS. It must be null if communication should not be encrypted, and it must not be null if communication should be encrypted with TLS.
  • Method Details

    • createSocket

      @NotNull public final Socket createSocket() throws UnsupportedOperationException
      Creates an unconnected socket that will use the configured proxy server for communication. Note that this method can only be used when communication through the proxy server will not be encrypted.
      Overrides:
      createSocket in class SocketFactory
      Throws:
      UnsupportedOperationException - If an SSLSocketFactory has been configured to secure communication with end servers.
    • createSocket

      @NotNull public final Socket createSocket(@NotNull String host, int port) throws IOException
      Creates a new socket that is connected to the specified system through the proxy server.
      Specified by:
      createSocket in class SocketFactory
      Parameters:
      host - The address of the server to which the socket should be established. It must not be null.
      port - The port of the server to which the socket should be established.
      Throws:
      IOException - If a problem is encountered while attempting to establish the connection.
    • createSocket

      @NotNull public final Socket createSocket(@NotNull String host, int port, @Nullable InetAddress localHost, int localPort) throws IOException
      Creates a new socket that is connected to the specified system through the proxy server.
      Specified by:
      createSocket in class SocketFactory
      Parameters:
      host - The address of the server to which the socket should be established. It must not be null.
      port - The port of the server to which the socket should be established.
      localHost - The local address to which the socket should be bound. It may optionally be null it may be bound to any local address.
      localPort - The local port to which the socket should be bound.
      Throws:
      IOException - If a problem is encountered while attempting to establish the connection.
    • createSocket

      @NotNull public final Socket createSocket(@NotNull InetAddress host, int port) throws IOException
      Creates a new socket that is connected to the specified system through the proxy server.
      Specified by:
      createSocket in class SocketFactory
      Parameters:
      host - The address of the server to which the socket should be established. It must not be null.
      port - The port of the server to which the socket should be established.
      Throws:
      IOException - If a problem is encountered while attempting to establish the connection.
    • createSocket

      @NotNull public final Socket createSocket(@NotNull InetAddress host, int port, @Nullable InetAddress localHost, int localPort) throws IOException
      Creates a new socket that is connected to the specified system through the proxy server.
      Specified by:
      createSocket in class SocketFactory
      Parameters:
      host - The address of the server to which the socket should be established. It must not be null.
      port - The port of the server to which the socket should be established.
      localHost - The local address to which the socket should be bound. It may optionally be null if it may be bound to any local address.
      localPort - The local port to which the socket should be bound.
      Throws:
      IOException - If a problem is encountered while attempting to establish the connection.