174.9. SSL 支持(HTTPS)
使用 JSSE 配置实用程序
自 Camel 2.8 起,Jetty 组件通过 Camel JSSE 配置实用程序支持 SSL/TLS 配置。这个实用程序可大大减少您需要写入的组件特定代码量,并在端点和组件级别进行配置。以下示例演示了如何将 实用程序与 Jetty 组件一起使用。
组件的编程配置
基于 Spring DSL 的端点配置
直接配置 Jetty
jetty 开箱即用提供 SSL 支持。要启用 Jetty 在 SSL 模式下运行,只需使用 https:// 前缀格式化 URI,例如:
<from uri="jetty:https://0.0.0.0/myapp/myservice/"/>
<from uri="jetty:https://0.0.0.0/myapp/myservice/"/>
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
Camel 2.3, 2.4
*from Camel 2.5 我们切换为使用 SslSelectChannelConnector *
您在上述映射中用作键的值是将 Jetty 配置为侦听的端口。
174.9.1. 在 IBM Java 中使用 TLS 安全性配置 camel-jetty9 复制链接链接已复制到粘贴板!
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 ()" 方法的末尾添加以下代码:
此代码通过删除排除所有 SSL solutions 密码来覆盖 Jetty 中定义的排除密码。
174.9.2. 配置常规 SSL 属性 复制链接链接已复制到粘贴板!
从 Camel 2.5 开始提供
现在,您可以配置适用于所有 SSL 套接字连接器的通用属性,而不是每个端口号特定的 SSL 套接字连接器。
174.9.3. 如何获取对 X509Certificate 的引用 复制链接链接已复制到粘贴板!
jetty 在 HttpServletRequest 中存储对证书的引用,如下所示:
HttpServletRequest req = exchange.getIn().getBody(HttpServletRequest.class);
X509Certificate cert = (X509Certificate) req.getAttribute("javax.servlet.request.X509Certificate")
HttpServletRequest req = exchange.getIn().getBody(HttpServletRequest.class);
X509Certificate cert = (X509Certificate) req.getAttribute("javax.servlet.request.X509Certificate")
174.9.4. 配置常规 HTTP 属性 复制链接链接已复制到粘贴板!
从 Camel 2.5 开始提供
现在,您可以配置适用于所有 HTTP 套接字连接器的通用属性,而不是每个端口号特定的 HTTP 套接字连接器(这没有明确配置为条目)。
如果 HTTP 请求由 Apache 服务器处理,并通过 mod_proxy 转发到 jetty,原始客户端 IP 地址位于 X-Forwarded-For 标头中,并且 HttpServletRequest.getRemoteAddr ()将返回 Apache 代理的地址。
jetty 有一个 forward 属性,它取 X-Forwarded-For 的值,并将它放在 HttpServletRequest remoteAddr 属性中。此属性不能直接通过端点配置获得,但可以使用 socketConnectors 属性轻松添加:
当现有 Apache 服务器处理域的 TLS 连接并将其代理到内部应用服务器时,这特别有用。