174.9. SSL 支持(HTTPS)


使用 JSSE 配置实用程序

自 Camel 2.8 起,Jetty 组件通过 Camel JSSE 配置实用程序支持 SSL/TLS 配置。这个实用程序可大大减少您需要写入的组件特定代码量,并在端点和组件级别进行配置。以下示例演示了如何将 实用程序与 Jetty 组件一起使用。

组件的编程配置

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);

JettyComponent jettyComponent = getContext().getComponent("jetty", JettyComponent.class);
jettyComponent.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="jetty:https://127.0.0.1/mail/?sslContextParameters=#sslContextParameters"/>
...
Copy to Clipboard Toggle word wrap

直接配置 Jetty

jetty 开箱即用提供 SSL 支持。要启用 Jetty 在 SSL 模式下运行,只需使用 https:// 前缀格式化 URI,例如:

<from uri="jetty:https://0.0.0.0/myapp/myservice/"/>
Copy to Clipboard Toggle word wrap

jetty 还需要知道要从中加载您的密钥存储的位置以及要使用什么密码来加载正确的 SSL 证书。设置以下 JVM 系统属性:

Camel 2.2

  • jetty.ssl.keystore 指定 Java 密钥存储文件的位置,该文件在 密钥条目 中包含 Jetty 服务器自己的 X.509 证书。密钥条目存储 X.509 证书(有效,公钥)及其关联的私钥。
  • jetty.ssl.password 存储密码,这是访问密钥存储文件所必需的(这与为 keystore 命令的 -storepass 选项提供的密码相同)。
  • jetty.ssl.keypassword 是密钥密码,用于访问密钥存储中的证书密钥条目(这与为 keystore 命令的 -keypass 选项提供的密码相同)。

从 Camel 2.3 开始

  • org.eclipse.jetty.ssl.keystore 指定 Java 密钥存储文件的位置,该文件在 键条目 中包含 Jetty 服务器自己的 X.509 证书。密钥条目存储 X.509 证书(有效,公钥)及其关联的私钥。
  • org.eclipse.jetty.ssl.password 访问存储密码,这是访问密钥存储文件所必需的(这与为 keystore 命令的 -storepass 选项提供的密码相同)。
  • org.eclipse.jetty.ssl.keypassword 是密钥密码,用于访问密钥存储中的证书密钥条目(这与为 keystore 命令的 -keypass 选项提供的密码相同)。

有关如何在 Jetty 端点上配置 SSL 的详情,请参考 Jetty 站点中的以下文档: http://docs.codehaus.org/display/JETTY/How+to+configure+SSL

有些 SSL 属性不直接由 Camel 公开,但 Camel 会公开底层 SslSocketConnector,这将允许您为需要客户端证书或 wantClientAuth 用于 mutual 身份验证设置属性,如 needClientAuth 用于 mutual 身份验证,但可以有一个证书。各种 Camel 版本之间存在一些差别:

最多 Camel 2.2

<bean id="jetty" class="org.apache.camel.component.jetty.JettyHttpComponent">
    <property name="sslSocketConnectors">
        <map>
            <entry key="8043">
                <bean class="org.mortbay.jetty.security.SslSocketConnector">
                    <property name="password"value="..."/>
                    <property name="keyPassword"value="..."/>
                    <property name="keystore"value="..."/>
                    <property name="needClientAuth"value="..."/>
                    <property name="truststore"value="..."/>
                </bean>
            </entry>
        </map>
    </property>
</bean>
Copy to Clipboard Toggle word wrap

Camel 2.3, 2.4

<bean id="jetty" class="org.apache.camel.component.jetty.JettyHttpComponent">
    <property name="sslSocketConnectors">
        <map>
            <entry key="8043">
                <bean class="org.eclipse.jetty.server.ssl.SslSocketConnector">
                    <property name="password"value="..."/>
                    <property name="keyPassword"value="..."/>
                    <property name="keystore"value="..."/>
                    <property name="needClientAuth"value="..."/>
                    <property name="truststore"value="..."/>
                </bean>
            </entry>
        </map>
    </property>
</bean>
Copy to Clipboard Toggle word wrap

*from Camel 2.5 我们切换为使用 SslSelectChannelConnector *

<bean id="jetty" class="org.apache.camel.component.jetty.JettyHttpComponent">
    <property name="sslSocketConnectors">
        <map>
            <entry key="8043">
                <bean class="org.eclipse.jetty.server.ssl.SslSelectChannelConnector">
                    <property name="password"value="..."/>
                    <property name="keyPassword"value="..."/>
                    <property name="keystore"value="..."/>
                    <property name="needClientAuth"value="..."/>
                    <property name="truststore"value="..."/>
                </bean>
            </entry>
        </map>
    </property>
</bean>
Copy to Clipboard Toggle word wrap

您在上述映射中用作键的值是将 Jetty 配置为侦听的端口。

camel-jetty9 组件中的默认 TLS 安全设置与 IBM Java 虚拟机不兼容。IBM Java 中的所有密码都以 前缀 SSL fluentd 开头,即使 TLS 协议的密码都以 SSL fluentd 开始。camel-jetty9 仅支持 RFC Cipher Suite 名称,且所有 SSL solutions 密码 都不受保护,且被排除。jetty 排除所有 SSL swig 密码,因此没有可用于 TLS 1.2 和连接的密码。因为无法更改 Jetty 的 ssl 上下文的行为,因此只有临时解决方案来覆盖 Jetty9 组件上的默认 TLS 安全配置。要达到此目的,请在 Application.java 文件的 "sslContextParameters ()" 方法的末尾添加以下代码:

FilterParameters fp = new FilterParameters();
    fp.getInclude().add(".*");

    // Exclude weak / insecure ciphers
    fp.getExclude().add("^.*_(MD5|SHA|SHA1)$");
    // Exclude ciphers that don't support forward secrecy
    fp.getExclude().add("^TLS_RSA_.*$");
    // The following exclusions are present to cleanup known bad cipher
    // suites that may be accidentally included via include patterns.
    // The default enabled cipher list in Java will not include these
    // (but they are available in the supported list).
    /* SSL_ ciphers are not excluded
    fp.getExclude().add("^SSL_.*$"); */
    fp.getExclude().add("^.NULL.$");
    fp.getExclude().add("^.anon.$");

    p.setCipherSuitesFilter(fp);
Copy to Clipboard Toggle word wrap

此代码通过删除排除所有 SSL solutions 密码来覆盖 Jetty 中定义的排除密码。

174.9.2. 配置常规 SSL 属性

从 Camel 2.5 开始提供

现在,您可以配置适用于所有 SSL 套接字连接器的通用属性,而不是每个端口号特定的 SSL 套接字连接器。

<bean id="jetty" class="org.apache.camel.component.jetty.JettyHttpComponent">
    <property name="sslSocketConnectorProperties">
        <map>
            <entry key="password"value="..."/>
            <entry key="keyPassword"value="..."/>
            <entry key="keystore"value="..."/>
            <entry key="needClientAuth"value="..."/>
            <entry key="truststore"value="..."/>
        </map>
    </property>
</bean>
Copy to Clipboard Toggle word wrap

174.9.3. 如何获取对 X509Certificate 的引用

jetty 在 HttpServletRequest 中存储对证书的引用,如下所示:

HttpServletRequest req = exchange.getIn().getBody(HttpServletRequest.class);
X509Certificate cert = (X509Certificate) req.getAttribute("javax.servlet.request.X509Certificate")
Copy to Clipboard Toggle word wrap

174.9.4. 配置常规 HTTP 属性

从 Camel 2.5 开始提供

现在,您可以配置适用于所有 HTTP 套接字连接器的通用属性,而不是每个端口号特定的 HTTP 套接字连接器(这没有明确配置为条目)。

<bean id="jetty" class="org.apache.camel.component.jetty.JettyHttpComponent">
    <property name="socketConnectorProperties">
        <map>
            <entry key="acceptors" value="4"/>
            <entry key="maxIdleTime" value="300000"/>
        </map>
    </property>
</bean>
Copy to Clipboard Toggle word wrap

如果 HTTP 请求由 Apache 服务器处理,并通过 mod_proxy 转发到 jetty,原始客户端 IP 地址位于 X-Forwarded-For 标头中,并且 HttpServletRequest.getRemoteAddr ()将返回 Apache 代理的地址。

jetty 有一个 forward 属性,它取 X-Forwarded-For 的值,并将它放在 HttpServletRequest remoteAddr 属性中。此属性不能直接通过端点配置获得,但可以使用 socketConnectors 属性轻松添加:

<bean id="jetty" class="org.apache.camel.component.jetty.JettyHttpComponent">
    <property name="socketConnectors">
        <map>
            <entry key="8080">
                <bean class="org.eclipse.jetty.server.nio.SelectChannelConnector">
                    <property name="forwarded" value="true"/>
                </bean>
            </entry>
        </map>
    </property>
</bean>
Copy to Clipboard Toggle word wrap

当现有 Apache 服务器处理域的 TLS 连接并将其代理到内部应用服务器时,这特别有用。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat