В этом посте я попытаюсь прояснить некоторые концепции, которые покажут, как настроить клиент и сервер 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>