当前位置: 首页 > 知识库问答 >
问题:

驼峰码头终结点在没有证书的情况下接受客户端消息

吕琪
2023-03-14

我正在尝试为证书配置基于camel jetty的restendpoint。每当我在没有客户端证书的情况下向httpsendpoint发送请求时,它仍然工作,也就是说,从restendpoint有一个有效的响应。我如何确保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个答案

诸葛亮
2023-03-14

您的javax.net.ssl。SSLParameters需要具有.setNeedClientAuth(true)

参见:https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/SSLParameters.html#setNeedClientAuth-布尔型-

身份验证发生在TLS级别。

如果您的客户端无法进行身份验证,则无法返回 HTTP 状态代码,因为该身份验证发生在 HTTP 层之前,即使存在请求或响应也是如此。TLS 层将终止连接。

 类似资料:
  • 我已经将Java项目从Eclipse导出为“可运行的JAR文件”,并带有“将所需库提取到生成的JAR中”。当我尝试通过双击启动它时,什么也没有发生,只是文件闪烁。当我尝试像那样从终端运行它时,它工作得很好。

  • 我只需要"解除屏蔽"我的终端后...有一些选项或setpup为它? 注意:我的服务正在使用,因此假设不需要在命令行上使用。 PS:我需要保持容器运行,我不需要使用

  • 我需要将数据发布到REST接口,但是接收主机使用的是自签名证书(这一点不会改变),因此我需要忽略我收到的明显的证书验证错误。 我的初始脚本如下所示: 如前所述,这将生成以下StackTrace: 回溯(最近一次调用):文件“send_data.py”,第15行,在urlopen(post_it_早已,context=ctx)文件“c:\users\myusername\appdata\local\

  • 问题内容: 它看起来像一个标准问题,但是我在任何地方都找不到清晰的方向。 我有Java代码试图连接到可能带有自签名(或过期)证书的服务器。该代码报告以下错误: 据我了解,我必须使用keytool并告诉java允许这种连接是可以的。 解决此问题的所有说明均假定我完全精通keytool,例如 生成服务器的私钥并将其导入密钥库 是否有人可以发布详细说明? 我正在运行Unix,所以bash脚本是最好的。

  • 我收到了一个新的密钥库。jks文件用于ssl连接,以替换旧的但仍在工作的。jks密钥库文件,但我收到了“意外握手消息:serve_hello”错误。我被告知要确保密钥库包含客户端证书,所以我使用keytool将其证书导出到pem文件,然后使用openssl检查目的。结果显示 证书用途:SSL客户端:否SSL客户端CA:否SSL服务器:是SSL服务器CA:否... 然而,当我应用相同的过程来检查旧的

  • 有人能帮我回答以下问题吗: 我有一个启用SSL的REST服务器和一个位于两台不同计算机上的REST客户端。两者都是用Spring Boot构建的。服务器将具有。p12或。pfx证书。