239.7.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("netty", NettyComponent.class);
nettyComponent.setSslContextParameters(scp);
Copy to Clipboard Toggle word wrap

基于 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"/>
...
Copy to Clipboard Toggle word wrap

在 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 =
         "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);
          }
       }
  }
});
Copy to Clipboard Toggle word wrap

获取 SSLSession 和客户端证书

可作为 Camel 2.12 提供

如果需要获取客户端证书的详细信息,您可以获得 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();
Copy to Clipboard Toggle word wrap

记住要设置 needClientAuth=true 以对客户端进行身份验证,否则 SSLSession 无法访问客户端证书的相关信息,并且您可能会获得一个例外 javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated。如果客户端证书已过期或者无效等,您可能还会获得这个例外。

提示

选项 sslClientCertHeaders 可设置为 true,然后增强 Camel 消息并带有有关客户端证书详情。例如,标题 CamelNettySSLClientCertSubjectName 即可使用主体名称。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat