骆驼码头端点接受没有证书的客户消息

时间:2020-10-26 20:50:05

标签: java apache-camel jetty jetty-9 spring-camel

我正在尝试为证书配置基于骆驼码头的其余端点。每当我在没有客户端证书的情况下向https端点 发送请求时,该请求仍然有效,即,来自其余端点的有效响应。 我如何确保 a)只有拥有有效证书的客户才能提出请求 b)为未经授权的客户或没有适当证书的情况提高例外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();   
}

1 个答案:

答案 0 :(得分: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层将终止连接。