Статьи

Настройка HTTPS в муле

В этом посте я попытаюсь прояснить некоторые концепции, которые покажут, как настроить клиент и сервер HTTPS в Mule для SSL и двусторонней SSL (взаимной аутентификации).

Ниже приведено объяснение ролей, которые хранилище ключей и хранилище доверенных сертификатов играют в HTTPS, а также того, как они упоминаются в Mule.

Хранилище ключей (tls-key-store в Mule): Хранилище ключей содержит закрытые ключи и сертификаты с соответствующими им открытыми / закрытыми ключами. Это необходимо только в том случае, если Mule предоставляет конечную точку HTTP (сервер) или удаленный сервер требует аутентификации клиента. В Mule это определяется атрибутом tls-key-store на соединителе HTTPS.

Хранилище доверия (tls-server в Mule): используется в качестве хранилища CA (центра сертификации) или простых сертификатов, которым клиент должен доверять. Примечание: это требуется только в том случае, если сервер, к которому мы подключаемся, имеет сертификат, который подписан органом, не распознанным в хранилище доверенных сертификатов Java, или сертификат самоподписан. В Mule это настраивается с помощью атрибута tls-server на соединителе HTTPS.

Примечание. Одним из основных источников неоднозначности при использовании коннектора HTTPS является использование tls-client, это избыточно (см. JIRA MULE-5213 ) и является известной проблемой. Это не требуется для настройки SSL или двустороннего SSL.

Односторонний SSL

Для обычного SSL на соединителе сервера нам нужно хранилище ключей, в котором находятся сертификат и закрытый ключ сервера. В этом примере мы используем самозаверяющие сертификаты, поэтому нам нужен клиент на стороне клиента.

Ниже приведены HTTPS-соединители сервера и клиента для обычного SSL с самозаверяющим сертификатом на стороне сервера:

<https:connector name="httpsServerConnector" doc:name="HTTP\HTTPS" validateConnections="true">
<https:tls-key-store path="server-keystore.jks" keyPassword="keypass" storePassword="keypass" />
</https:connector>

<https:connector name="httpsClientConnector" doc:name="HTTP\HTTPS" validateConnections="true">
<https:tls-server path="client-truststore.jks" storePassword="keypass"/>
</https:connector>

Двусторонний SSL (взаимная аутентификация)

При настройке двустороннего SSL  между клиентом и сервером HTTPS в Mule нам необходимо:

1) настроить клиентский соединитель HTTPS с хранилищем ключей клиента и хранилищем доверенных сертификатов. Хранилище ключей клиента должно содержать открытый сертификат клиента и закрытый ключ. Клиентское доверенное хранилище должно содержать сертификат сервера.

2) настройте на соединителе сервера и хранилище ключей сервера, и хранилище доверенных сертификатов, а также установите для параметра requireClientAuthentication значение true в атрибуте tls-server (т.е. хранилище доверенных сертификатов). Это заставит соединитель сервера проверять клиентские запросы в хранилище доверенных сертификатов до предоставления доступа.

Хранилище ключей сервера должно содержать открытый сертификат и закрытый ключ сервера. Склад доверенных сертификатов должен содержать сертификат клиента.

Для создания самозаверяющего сертификата, доверенного хранилища и хранилища ключей для нашей службы HTTPS использовался инструмент Java Keytool. Однако следующий графический инструмент может оказаться полезным.

Ниже приведена конфигурация соединителя сервера HTTPS для двустороннего SSL:

<https:connector name="httpsServerConnector" doc:name="HTTP\HTTPS" validateConnections="true">
<https:tls-key-store path="server-keystore.jks" keyPassword="keypass" storePassword="keypass" />
<https:tls-server path="server-truststore.jks"  requireClientAuthentication="true" storePassword="keypass" />
</https:connector>

и поток с входящим HTTPS с использованием вышеуказанного соединителя:

<flow name="httpsServer" doc:name="httpsServer">
<https:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8083" connector-ref="httpsServerConnector" doc:name="HTTPS" />
<logger message="accessed https server successfully!" level="INFO" doc:name="Logger" />
</flow>

Ниже приведена конфигурация клиентского соединителя HTTPS для двустороннего SSL:

<https:connector name="httpsClientConnector" doc:name="HTTP\HTTPS" validateConnections="true" >
<https:tls-key-store path="client-keystore.jks" keyPassword="keypass" storePassword="keypass" />
<https:tls-server path="client-truststore.jks" storePassword="keypass"/>
</https:connector>

Клиентский поток, принимающий HTTP-запросы и отправляющий на HTTPS-сервер:

<flow name="httpsClient" doc:name="httpsClient">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" doc:name="HTTP" path="test">
</http:inbound-endpoint>
<logger message="sending request from https client to https server..." level="INFO" doc:name="Logger" />
<https:outbound-endpoint exchange-pattern="request-response" host="localhost" port="8083" connector-ref="httpsClientConnector" doc:name="HTTP" />
</flow>