【问题标题】:Camel jetty endpoint accepting client messages without certificate骆驼码头端点接受没有证书的客户端消息
【发布时间】:2020-10-26 20:50:05
【问题描述】:

我正在尝试为证书配置基于骆驼码头的休息端点。每当我向 https 端点 没有 客户端证书发送请求时,它仍然可以工作,即,来自 rest 端点的有效响应。 我如何确保 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();   
}

【问题讨论】:

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


    【解决方案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 层将终止连接。

    【讨论】:

    • 谢谢。要在骆驼中设置 .setNeedClientAuth(true),我将以下代码添加到 Main - SSLContextServerParameters scsp = new SSLContextServerParameters(); scsp.setClientAuthentication("需要"); SSLContextParameters scp = new SSLContextParameters(); scp.setServerParameters(scsp);
    猜你喜欢
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多