Каков наиболее оптимальный способ создать API на apache camel с внедрением (SSL) для HTTPS?

#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, что, надеюсь, должно быть решено сейчас.