#java #apache #maven #apache-camel #netty
#java #apache #maven #apache-camel #netty
Вопрос:
Я хочу, чтобы мой API, созданный с помощью Apache-Camel, включал HTTPS. Я провел некоторое ознакомление с различными способами (используя Jetty, Netty и т.д.), Но я хочу знать, какой самый простой и эффективный способ внедрения SSL в мой API на базе camel. Вот моя текущая конфигурация, я бы предпочел (для простоты, если бы я мог использовать netty4-http)
public void configure() {
restConfiguration()
.component("netty4-http")//Specifies the Camel component to use as the REST transport
.host("0.0.0.0")//The hostname to use for exposing the REST service
.port(8080).bindingMode(RestBindingMode.auto)
.rest("/v1/API.Endpoint")
Спасибо, ребята!
Ответ №1:
Вы можете настроить компонент Netty4, как указано в официальных документах, сначала указав SSLContextParameters
используемый, который просто определяет, где можно найти сертификат для использования во время SSL-квитирования, а затем установить его в компонент netty:
KeyStoreParameters ksp = new KeyStoreParameters();
ksp.setResource("/users/home/server/keystore.jks");
ksp.setPassword("keystorePassword");
KeyManagersParameters kmp = new KeyManagersParameters();
kmp.setKeyStore(ksp);
kmp.setKeyPassword("keyPassword");
SSLContextParameters scp = new SSLContextParameters();
scp.setKeyManagers(kmp);
NettyComponent nettyComponent = getContext().getComponent("netty4", NettyComponent.class);
nettyComponent.setSslContextParameters(scp);
Если вы используете Spring (Boot), это можно легко сделать во время процедуры инициализации контекста Camel:
@Bean
CamelContextConfiguration contextConfiguration() {
return new CamelContextConfiguration() {
@Override
public void beforeApplicationStart(CamelContext camelContext) {
// code goes in here
}
@Override
public void afterApplicationStart(CamelContext camelContext) {
// noop
}
};
}
Обратите внимание, что указанный выше компонент был назван netty4
, это также должно быть отражено в части конфигурации rest:
restConfiguration()
.component("netty4")
.host("0.0.0.0")
.scheme("https")
.port(8443)
...
Аналогичный подход можно увидеть, только с использованием Jetty в качестве настроенного HTTP-сервера в одном из моих проектов технической демонстрации, который сохраняет конфигурацию SSLContextParamteter в своем собственном компоненте, который вводится в конфигурацию Jetty, которая просто устанавливает эти параметры для настроенного компонента Jetty. Позже он restConfiguration
абстрагируется в базовый класс, из которого будут расширяться определенные маршруты, предоставляющие конечные точки через Jetty.
Обратите внимание далее, что вы можете использовать компонент Jetty или Netty по умолчанию. В моей демонстрации у меня была ошибка с клиентами TLS 1.0 и 1.1, которые не могли подключиться, поскольку Jetty 9.4 по умолчанию исключал все небезопасные шифры, а Camel неправильно передавал настройки в Jetty, что, надеюсь, должно быть решено сейчас.