Skip to content

Mutual Auth SSL

Mutual Authentication with SSL

To establish a stronger trust relationship between client and server, we provide mutual authentication with SSL via client certs. This is particularly useful in providing additional validation for Preauthenticated SSO with HTTP Headers. Rather than just IP address validation, connections will only be accepted by Knox from clients presenting trusted certificates.

This behavior is configured for the entire gateway instance within the gateway-site.xml file. All topologies deployed within the configured gateway instance will require incoming connections to present trusted client certificates during the SSL handshake. Otherwise, connections will be refused.

The following table describes the configuration elements related to mutual authentication and their defaults:

Configuration Element Description
gateway.client.auth.needed True|False - indicating the need for client authentication. Default is False.
gateway.truststore.path Fully qualified path to the trust store to use. Default is the keystore used to hold the Gateway's identity. See gateway.tls.keystore.path.
gateway.truststore.type Keystore type of the trust store. Default is JKS.
gateway.truststore.password.alias Alias for the password to the trust store.
gateway.trust.all.certs Allows for all certificates to be trusted. Default is false.

By only indicating that it is needed with gateway.client.auth.needed, the keystore identified by gateway.tls.keystore.path is used. By default this is {GATEWAY_HOME}/data/security/keystores/gateway.jks. This is the identity keystore for the server, which can also be used as the truststore. To use a dedicated truststore, gateway.truststore.path may be set to the absolute path of the truststore file.
The type of truststore file should be set using gateway.truststore.type; else, JKS will be assumed.
If the truststore password is different from the Gateway's master secret then it can be set using

knoxcli.sh create-alias {password-alias} --value {pwd}

The password alias name ({password-alias}) is set using gateway.truststore.password.alias; else, the alias name of "gateway-truststore-password" should be used.
If a password is not found using the provided (or default) alias name, then the Gateway's master secret will be used.

Exclude a Topology from mTLS

There is a possibility to exclude specific topologies from mutual authentication.

Configuration Element Description
gateway.client.auth.needed True - Indicating the need for client authentication.
gateway.port.mapping.enabled True - Enabling the port mapping feature. It is turned on by default.
gateway.port.mapping.{topologyName} The port number that this topology will listen on.
gateway.client.auth.exclude The names of the topologies separated by comma. These topologies will be excluded from mTLS.

To exclude a topology from mTLS we use the port mapping feature. The gateway.port.mapping.enabled feature has to be enabled which is the default behaviour and a port number has to be provided for the topology with the gateway.port.mapping.{topologyName} property. The same topology needs to be added to the gateway.client.auth.exclude property.

The below example excludes the health topology from mTLS on the 9443 port.

  <property>
      <name>gateway.port.mapping.health</name>
      <value>9443</value>
      <description>Topology and Port mapping</description>
  </property>
  <property>
      <name>gateway.client.auth.exclude</name>
      <value>health</value>
      <description>Topology excluded from mTLS</description>
  </property>

An example how one can access the health topology on port 9443 without mTLS.

 https://{gateway-host}:9443/{gateway-path}/health