Подключение Mulesoft к Кафке в Heroku - PullRequest
1 голос
/ 13 января 2020

сообщество!

Я пытаюсь подключить свое приложение Mulesoft к серверу Kafka, который расположен в Heroku. Anypoint Studio 7 (Mule 4) имеет разъем Kafka, который имеет несколько вариантов подключения (Basi c, Kerberos, Kerberos SSL и SSL):

Kafka Connector's Setup

Согласно документации Heroku, он "поддерживает" SSL, но не упоминает, что это необходимо. Кто-нибудь может подтвердить?

Документацию Heroku, которую я видел [https://devcenter.heroku.com/articles/kafka-on-heroku]

Когда я настраиваю приложение в Heroku, добавьте Kafka AddOn, создайте топи c, я получаю bootstrap сервер (ы) от запуска команды heroku config:get KAFKA_URL Если я пытаюсь выполнить тест abasi c, я получаю следующую ошибку:

enter image description here

В сообщении об ошибке org.mule.runtime.api.connection.ConnectionException: invalid connection! org.mule.runtime.api.connection.ConnectionException: invalid connection! Caused by: org.apache.kafka.common.errors.TimeoutException: Timed out waiting for a node assignment.

я пытаюсь построить Po C с двумя потоками ... один, который выдает сообщение Topi c и другой поток, потребляемый из него.

enter image description here

Любая помощь по настройке разъема и среды Heroku будет очень кстати


ОБНОВЛЕНИЕ:

Я обнаружил, что при создании приложения в Heroku и включении дополнения KAFKA вы получаете следующие переменные:

KAFKA_URL : A разделенный запятыми список URL-адресов SSL для брокеров Kafka, составляющих кластер. Пример:

kafka + ssl: //ec2-3-*****-100.compute-1.amazonaws.com: 9096, kafka + ssl: // ec2- 3 - ****** - 127.compute-1.amazon aws .com: 9096

KAFKA_TRUSTED_CERT: SSL-сертификат брокера (в формате PEM) , чтобы проверить, что вы подключаетесь к нужным серверам. Пример: * * * тысяча пятьдесят два тысяча пятьдесят три * * * 1054 ----- BEGIN CERTIFICATE ----- MIIDfzCCAmegAwIBAgIBADANBgkqhkiG9w0BAQsFADAyMTAwLgYDVQQDDCdjYS1l ZjQwOWUzNy00NjhhLTRiMGEtOGVkOC0wZWYxMmRhYjkyZWEwHhcNMTkxMjEyMTUx NzU5WhcNMjkxMjEyMTUxNzU5WjAyMTAwLgYDVQQDDCdjYS1lZjQwOWUzNy00Njhh

KAFKA_CLIENT_CERT: требуемый сертификат клиента (в PEM формат) для проверки подлинности клиентов против брокера. Пример:

* * ----- тысяча шестьдесят два BEGIN CERTIFICATE ----- MIIDQzCCAiugAwIBAgIBADANBgkqhkiG9w0BAQsFADAyMTAwLgYDVQQDDCdjYS1l ZjQwOWUzNy00NjhhLTRiMGEtOGVkOC0wZWYxMmRhYjkyZWEwHhcNMjAwMTE1MTU1 MjU2WhcNMzAwMTE1MTU1MjU2WjAZMRcwFQYDVQQDDA51NnZtYWVzM2cwZnMyZj CC

KAFKA_CLIENT_CERT_KEY: Необходимый сертификат клиента ключ (в формате PEM) для аутентификации клиентов по отношению к брокеру. Кластеры Kafka требуют аутентификации с использованием предоставленного сертификата клиента. Любые запросы, не использующие сертификат клиента, будут отклонены. Пример:

----- НАЧАТЬ RSA PRIVATE KEY ----- MIIEpAIBAAKCAQEAmmu + j9DulVnqwIOt02 ++ 6Ehw9Mg7KaocdIQjODVtVipC5AyK iaHsdNVh9bgJQAJSfstIV / 6O1mCLmjUS / YmyIEEgmBvATFxcldPGBGcpPVSV2R3Q

Я полагаю, что нужно мне «преобразовать» их в KeyStore и TrustStore для конфигурации SSL для Connector. Кто-нибудь может подтвердить? поскольку для того, что я вижу из документов, требуется SSL


Еще одно обновление:

Я скачал сертификаты, которые я описал выше, и с помощью инструмента "Обозреватель ключей" создал хранилище ключей. jks и импортировал в него KAFKA_CLIENT_CERT и KAFKA_CLIENT_CERT_KEY, а затем я создал truststore.jsk и импортировал туда файл KAFKA_TRUSTED_CERT. в обоих случаях я установил основной пароль c ... выглядел хорошо, но я получаю сообщение об ошибке:

org.mule.runtime.api.connection.ConnectionException: invalid connection!
  org.mule.runtime.api.connection.ConnectionException: invalid connection!
  Caused by: org.apache.kafka.common.errors.SslAuthenticationException: SSL handshake failed
  Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
    at sun.security.ssl.Handshaker.checkThrown(Handshaker.java:1521)
    at sun.security.ssl.SSLEngineImpl.checkTaskThrown(SSLEngineImpl.java:528)
    at sun.security.ssl.SSLEngineImpl.writeAppRecord(SSLEngineImpl.java:1197)
    at sun.security.ssl.SSLEngineImpl.wrap(SSLEngineImpl.java:1165)
    at javax.net.ssl.SSLEngine.wrap(SSLEngine.java:469)
    at org.apache.kafka.common.network.SslTransportLayer.handshakeWrap(SslTransportLayer.java:448)
    at org.apache.kafka.common.network.SslTransportLayer.doHandshake(SslTransportLayer.java:313)
    at org.apache.kafka.common.network.SslTransportLayer.handshake(SslTransportLayer.java:265)
    at org.apache.kafka.common.network.KafkaChannel.prepare(KafkaChannel.java:170)
    at org.apache.kafka.common.network.Selector.pollSelectionKeys(Selector.java:547)
    at org.apache.kafka.common.network.Selector.poll(Selector.java:483)
    at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:540)
    at org.apache.kafka.clients.admin.KafkaAdminClient$AdminClientRunnable.run(KafkaAdminClient.java:1196)
    at java.lang.Thread.run(Thread.java:748)
  Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1709)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:318)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:310)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1639)
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:223)
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1037)
    at sun.security.ssl.Handshaker$1.run(Handshaker.java:970)
    at sun.security.ssl.Handshaker$1.run(Handshaker.java:967)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.security.ssl.Handshaker$DelegatedTask.run(Handshaker.java:1459)
    at org.apache.kafka.common.network.SslTransportLayer.runDelegatedTasks(SslTransportLayer.java:402)
    at org.apache.kafka.common.network.SslTransportLayer.handshakeUnwrap(SslTransportLayer.java:484)
    at org.apache.kafka.common.network.SslTransportLayer.doHandshake(SslTransportLayer.java:340)
    ... 7 more
  Caused by: java.security.cert.CertificateException: No name matching ec2-3-220-121-33.compute-1.amazonaws.com found
    at sun.security.util.HostnameChecker.matchDNS(HostnameChecker.java:231)
    at sun.security.util.HostnameChecker.match(HostnameChecker.java:96)
    at sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:455)
    at sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:436)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:252)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:136)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1626)
    ... 16 more

Может быть связано со строкой, вызванной:

java .security.cert.CertificateException: имя не соответствует ec2-3-220-121-33.compute-1.amazon aws .com найдено

1 Ответ

1 голос
/ 16 января 2020

Я получил его на работу.

создайте файлы JKS с помощью этих команд (требуется HEROKU CLI)

client_key=`heroku config:get KAFKA_CLIENT_CERT_KEY --app <SET_HEROKU_APP_NAME_HERE>`
client_cert=`heroku config:get KAFKA_CLIENT_CERT --app <SET_HEROKU_APP_NAME_HERE>`
trusted_cert=`heroku config:get KAFKA_TRUSTED_CERT --app <SET_HEROKU_APP_NAME_HERE>`
# Write config vars to files.
echo "$client_key" >> keystore.pem
echo -n "$client_cert" >> keystore.pem
echo -n "$trusted_cert" > truststore.pem
# Set passwords
TRUSTSTORE_PASSWORD=<SET_PASSWORD_HERE>
KEYSTORE_PASSWORD=<SET_PASSWORD_HERE>
echo $TRUSTSTORE_PASSWORD
echo $KEYSTORE_PASSWORD
# Import cert.
keytool -importcert -file truststore.pem -keystore kafka.client.truststore.jks -deststorepass $TRUSTSTORE_PASSWORD -noprompt
# Create PKCS12 file.
openssl pkcs12 -export -in keystore.pem -out keystore.pkcs12 -password pass:$KEYSTORE_PASSWORD
# Create jks files.
keytool -importkeystore -srcstoretype PKCS12 \
    -destkeystore kafka.client.keystore.jks -deststorepass $KEYSTORE_PASSWORD \
    -srckeystore keystore.pkcs12 -srcstorepass $KEYSTORE_PASSWORD

Затем настройте соединитель с опцией SSL и добавьте следующий INLINE:

enter image description here

...