问题描述
我正在尝试为证书配置基于骆驼码头的其余端点。每当我在没有客户端证书的情况下向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();
}
解决方法
您的javax.net.ssl.SSLParameters
必须有.setNeedClientAuth(true)
。
身份验证在TLS级别进行。
如果您的客户端无法通过身份验证,将无法返回HTTP状态代码,因为该身份验证发生在HTTP层之前,甚至存在于请求或响应中。 TLS层将终止连接。