Сделайте запрос Https с компонентом netty4-http Apache Camel - PullRequest
0 голосов
/ 17 января 2020

Я раскрыл простую службу REST с помощью Apache Верблюжий, как Spring boot microservice, который создает запрос к службе в https, используя компонент netty4-http.

public class RoutingTest extends RouteBuilder {

    @Override
    public void configure() throws Exception {

        restConfiguration()
            .host("localhost")
            .port("8080");

        rest().post("test") 
        .route()
            .setBody(constant("message=Hello"))
            .setHeader(Exchange.HTTP_METHOD, constant(HttpMethod.POST))
            .setHeader(Exchange.CONTENT_TYPE, constant("application/x-www-form-urlencoded"))
            .to("netty4-http:https://localhost/service/test");
    }
}

Когда я звоню http://localhost:8080/test, Я получаю ошибку 400 Bad Request при вызове службы маршрутизации https://localhost/service/test. Из журналов я прочитал, что запрос приходит в формате HTTP вместо HTTPS, и я не понимаю, почему:

You ' говорит простой HTTP на серверный порт с поддержкой SSL. Вместо этого используйте схему HTTPS для доступа к этому URL.

Если я вызываю службу https://localhost/service/test с почтальоном, она работает правильно.

SSL настроен с самоподписанным сертификат.

Как создать правильный запрос https для компонента netty в apache camel? Документация предлагает только замену протокола, самое большее несколько опций, которые, однако, не работают.

ОБНОВЛЕНИЕ (решено, см. Ниже)

Я обновил вызов в таким образом

.to("netty4-http:https://localhost/dpm/idp/oauth/token?ssl=true&sslContextParameters=#sslContextParameters");

Параметр ssl = true является обязательным, и я также настроил компонент для SSLContextParameters следующим образом:

@Bean(name = "sslContextParameters")
public static SSLContextParameters sslParameters() throws KeyManagementException, GeneralSecurityException, IOException {

    KeyStoreParameters ksp = new KeyStoreParameters();
    ksp.setResource("C:/myfolder/test.jks");

    KeyManagersParameters kmp = new KeyManagersParameters();
    kmp.setKeyStore(ksp);
    kmp.setKeyPassword("jskPassword");      

    SSLContextParameters scp = new SSLContextParameters();
    scp.setKeyManagers(kmp);

    SSLContextBuilder builder = new SSLContextBuilder();
    builder.loadTrustMaterial(new TrustSelfSignedStrategy());
    SSLContext sslcontext = builder.build();
    scp.createSSLContext().setDefault(sslcontext);

    return scp;
}

Я немного борюсь с классами, которые устарели. Для тестирования я оставляю только один метод устаревшим, потому что я должен работать с наследованием.

Если я правильно понял, мне пришлось сгенерировать файл JKS для зоны доверия, начиная с моих самозаверяющих сертификатов (.crt и .key файлы). После этого я добавил инструкции для KeyStoreParameters с паролем.

Это почти решено, но теперь я получаю эту ошибку, когда я выполняю

PKIX-компоновку пути ошибка: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти действительный путь сертификации к запрошенной цели

Ответы [ 2 ]

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

Возможно, вам нужно настроить sslContextParameters объект , который можно использовать для настройки компонента Netty для SSL.

Я не уверен насчет параметра имя. В документах написано sslContextParameters, но я подумал, что это sslContextParametersRef.

.to("netty4-http:https://localhost/service/test?sslContextParametersRef=#sslConfig");

#sslConfig означает, что Camel может получить объект из реестра с идентификатором sslConfig. Так, например, для Spring это будет управляемый bean-компонент Spring с идентификатором sslConfig.

Компонент Netty (не http) также имеет параметр ssl=true. Не знаю, нужно ли это также для Netty-http . Поэтому вам придется немного протестировать эти параметры.

Кстати, у документов компонента Netty есть пример SSL с конфигурацией параметров контекста et c. Посмотри на это.

0 голосов
/ 20 января 2020

Решено. Некоторые инструкции, необходимые для самозаверяющего сертификата, отсутствовали. Ниже приведен полный bean-компонент.

@Bean(name = "sslContextParameters")
public static SSLContextParameters sslParameters() throws KeyManagementException, GeneralSecurityException, IOException {

    KeyStoreParameters ksp = new KeyStoreParameters();
    ksp.setResource("C:/myfolder/test.jks");
    ksp.setPassword("jskPassword");

    KeyManagersParameters kmp = new KeyManagersParameters();
    kmp.setKeyStore(ksp);
    kmp.setKeyPassword("jskPassword");

    SSLContextParameters scp = new SSLContextParameters();
    scp.setKeyManagers(kmp);

    SSLContextBuilder builder = new SSLContextBuilder();
    builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
    SSLContext sslcontext = builder.build();
    scp.createSSLContext().setDefault(sslcontext);

    // Necessary for the the self-signed server certificate
    TrustManagersParameters tmp = new TrustManagersParameters();
    tmp.setKeyStore(ksp);
    scp.setTrustManagers(tmp);

    return scp;
}

Что касается файла test.jks, я создал его с помощью keytool, инструмента, поставляемого с JDK для управления сертификатами (создание, экспорт и импорт). В моем случае, уже создав сертификат с OpenSSL, мне нужно было создать только файл JKS (Java Keystore) для импорта. Для этого необходимо преобразовать сертификат в файл P12 (это должен быть архив) и, наконец, в JKS.

Во время выполнения операций вам будет предложено ввести пароли для обоих файлов

- openssl pkcs12 -export -in test.crt -inkey test.key -out test.p12
- keytool -importkeystore -srckeystore test.p12 -destkeystore test.jks -srcstoretype pkcs12
- keytool -importkeystore -srckeystore test.jks -destkeystore test.jks -deststoretype pkcs12

здесь test - это имя моего файла сертификата. Последняя операция не является обязательной, но она рекомендуется самим keytool для переноса формата JKS, проприетарного формата, если я правильно понимаю, в более распространенный формат PKCS12.

Значение jskPassword в коде есть пароль, который я установил при создании хранилища ключей.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...