35.7.3. 使用 Request-Reply 通信基于 SSL/TCP 的 Netty 消费者端点
使用 JSSE 配置实用程序
Netty 组件通过 Camel JSSE 配置实用程序 支持 SSL/TLS 配置。这个实用程序可大大减少您需要编写的组件特定代码的数量,并在端点和组件级别进行配置。以下示例演示了如何在 Netty 组件中使用 实用程序。
组件的编程配置
KeyStoreParameters ksp = new KeyStoreParameters(); ksp.setResource("/users/home/server/keystore.jks"); ksp.setPassword("keystorePassword"); KeyManagersParameters kmp = new KeyManagersParameters(); kmp.setKeyStore(ksp); kmp.setKeyPassword("keyPassword"); SSLContextParameters scp = new SSLContextParameters(); scp.setKeyManagers(kmp); NettyComponent nettyComponent = getContext().getComponent("netty", NettyComponent.class); nettyComponent.setSslContextParameters(scp);
基于 Spring DSL 的端点配置
... <camel:sslContextParameters id="sslContextParameters"> <camel:keyManagers keyPassword="keyPassword"> <camel:keyStore resource="/users/home/server/keystore.jks" password="keystorePassword"/> </camel:keyManagers> </camel:sslContextParameters>... ... <to uri="netty:tcp://0.0.0.0:5150?sync=true&ssl=true&sslContextParameters=#sslContextParameters"/> ...
在 Jetty 组件上使用基本 SSL/TLS 配置
Registry registry = context.getRegistry(); registry.bind("password", "changeit"); registry.bind("ksf", new File("src/test/resources/keystore.jks")); registry.bind("tsf", new File("src/test/resources/keystore.jks")); context.addRoutes(new RouteBuilder() { public void configure() { String netty_ssl_endpoint = "netty:tcp://0.0.0.0:5150?sync=true&ssl=true&passphrase=#password" + "&keyStoreFile=#ksf&trustStoreFile=#tsf"; String return_string = "When You Go Home, Tell Them Of Us And Say," + "For Your Tomorrow, We Gave Our Today."; from(netty_ssl_endpoint) .process(new Processor() { public void process(Exchange exchange) throws Exception { exchange.getOut().setBody(return_string); } } } });
获取 SSLSession 和客户端证书访问权限
如果要访问 javax.net.ssl.SSLSession
,则可获得有关客户端证书的详细信息。当 ssl=true
之后,Netty 组件会将 SSLSession
保存为 Camel 消息上的标头,如下所示:
SSLSession session = exchange.getIn().getHeader(NettyConstants.NETTY_SSL_SESSION, SSLSession.class); // get the first certificate which is client certificate javax.security.cert.X509Certificate cert = session.getPeerCertificateChain()[0]; Principal principal = cert.getSubjectDN();
请记住,要设置 需要ClientAuth=true
以验证客户端,否则 SSLSession
无法访问客户端证书的信息,并且您可能会获得一个例外 javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
。如果客户端证书过期或者无效等,您也可能会得到这个异常。
选项 sslClientCertHeaders
可以设置为 true
,然后使用包含客户端证书详情的标题增强 Camel 消息消息。例如,在标题 CamelNettySSLClientCertSubjectName
中可轻松获取主题名称。