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 中可轻松获取主题名称。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.