241.6.3. 使用 Request-Reply 通信的基于 SSL/TCP 的 Netty consumer 端点
使用 JSSE 配置实用程序
从 Camel 2.9 开始,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("netty4", 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="netty4:tcp://0.0.0.0:5150?sync=true&ssl=true&sslContextParameters=#sslContextParameters"/>
...
[[Netty4-UsingBasicSSL/TLSconfigurationontheJettyComponent] 在 Jetty 组件中使用基本 SSL/TLS 配置
JndiRegistry registry = new JndiRegistry(createJndiContext());
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.createRegistry(registry);
context.addRoutes(new RouteBuilder() {
public void configure() {
String netty_ssl_endpoint =
"netty4: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 4 组件会将 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();
记住要设置 needClientAuth=true 以对客户端进行身份验证,否则 SSLSession 无法访问客户端证书的相关信息,并且您可能会获得一个例外 javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated。如果客户端证书已过期或者无效等,您可能还会获得这个例外。
选项 sslClientCertHeaders 可设置为 true,然后增强 Camel 消息并带有有关客户端证书详情。例如,标题 CamelNettySSLClientCertSubjectName 即可使用主体名称。