Конечная точка верблюжьей пристани принимает клиентские сообщения без сертификата

Я пытаюсь настроить конечную точку отдыха на основе верблюжьей пристани для сертификата. Всякий раз, когда я отправляю запрос на конечную точку https без сертификата клиента, он все еще работает, т.е. есть действительный ответ от конечной точки отдыха. Как мне убедиться, что а) только клиенты с действующими сертификатами могут делать запросы б) создавать исключение 500 для неавторизованных клиентов или без надлежащих сертификатов.

Основной класс

    CamelContext context = new DefaultCamelContext();
    context.setStreamCaching(true);
    
    KeyStoreParameters ksp = new KeyStoreParameters();
    ksp.setResource("src/main/resources/security/keystore.jks");
    ksp.setPassword("password");

    KeyManagersParameters kmp = new KeyManagersParameters();
    kmp.setKeyStore(ksp);
    kmp.setKeyPassword("password");
    
    SSLContextParameters scp = new SSLContextParameters();
    scp.setKeyManagers(kmp);

    JettyHttpComponent9 jettyComponent = context.getComponent("jetty", JettyHttpComponent9.class);
    jettyComponent.setSslContextParameters(scp);
    
    context.addRoutes(new HelloRoute());
    context.start();

На верблюжьем маршруте

@Override
public void configure() throws Exception {

    onException(Exception.class)
        .handled(true)
        .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(500))
        .setBody(simple("${exception.message}\n"));
    
    restConfiguration()
        .component("jetty")
        .host("0.0.0.0")
        .port("6625")
        .scheme("https")
        .componentProperty("minThreads", "1")
        .componentProperty("maxThreads", "16");

    rest("/req/").consumes("application/json").produces("application/json")
        .post().to("direct:helloRoute");
         
    
    from("direct:helloRoute").convertBodyTo(String.class) 
        .choice()
            .when().jsonpath("$.Header[?(@.MessageType == 'Hello')]",true)
                .bean(HelloRoute.class, "helloRoute")
            .otherwise()
                .bean(HelloRoute.class,"otherwiseRoute")
        .endChoice();   
}

person Vikrant    schedule 26.10.2020    source источник


Ответы (1)


Ваш javax.net.ssl.SSLParameters должен иметь .setNeedClientAuth(true).

См .: https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/SSLParameters.html#setNeedClientAuth-boolean-

Аутентификация происходит на уровне TLS.

Невозможно будет вернуть код состояния HTTP, если ваши клиенты не смогут пройти аутентификацию, поскольку эта аутентификация происходит намного раньше уровня HTTP, даже если он присутствует для запроса или ответа. Уровень TLS разорвет соединение.

person Joakim Erdfelt    schedule 26.10.2020
comment
Спасибо. Чтобы установить .setNeedClientAuth (true) в camel, я добавил в Main следующий код - SSLContextServerParameters scsp = new SSLContextServerParameters (); scsp.setClientAuthentication (ТРЕБУЕТСЯ); SSLContextParameters scp = new SSLContextParameters (); scp.setServerParameters (scsp); - person Vikrant; 27.10.2020