Я раскрыл простую службу 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: невозможно найти действительный путь сертификации к запрошенной цели