174.9. SSL サポート (HTTPS)
JSSE 設定ユーティリティーの使用
Camel 2.8 の時点で、Jetty コンポーネントは Camel JSSE Configuration Utility を介した 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);
エンドポイントの 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"/> ...
Jetty を直接設定する
Jetty は、すぐに使える SSL サポートを提供します。Jetty を SSL モードで実行できるようにするには、URI を https://
接頭辞でフォーマットします。たとえば、次のようになります。
<from uri="jetty:https://0.0.0.0/myapp/myservice/"/>
Jetty は、正しい SSL 証明書をロードするために、キーストアのロード元と使用するパスワードを知る必要もあります。次の JVM システムプロパティーを設定します。
Camel 2.2 まで
-
jetty.ssl.keystore
は、Jetty サーバー独自の X.509 証明書を キーエントリー に含む Java キーストアファイルのロケーションを指定します。キーエントリーには、X.509 証明書 (事実上、公開鍵) とそれに関連付けられた秘密鍵が格納されます。 -
jetty.ssl.password
キーストアファイルにアクセスするために必要なストアパスワード (これは、keystore
コマンドの-storepass
オプションに指定されるパスワードと同じです)。 -
jetty.ssl.keypassword
キーストア内の証明書のキーエントリーにアクセスするために使用されるキーパスワード (これは、keystore
コマンドの-keypass
オプションに指定されるパスワードと同じです)。
Camel 2.3 以降
-
org.eclipse.jetty.ssl.keystore
は、Jetty サーバー独自の X.509 証明書を キーエントリー に含む Java キーストアファイルのロケーションを指定します。キーエントリーには、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 を公開しており、これにより、クライアント証明書を必要とする相互認証のための needClientAuth や、クライアントが証明書を必要としないが証明書を持つことができる相互認証のための wantClientAuth などのプロパティを設定することができます。さまざまな 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>
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>
*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>
上記のマップでキーとして使用する値は、Jetty がリッスンするように設定したポートです。
174.9.1. IBM Java での TLS セキュリティーを使用した camel-jetty9
の設定
camel-jetty9
コンポーネントのデフォルトの TLS セキュリティー設定は IBM Java 仮想マシンと互換性がありません。IBM Java のすべての暗号は prefix SSL_*
で始まり、TLS プロトコルの暗号も SSL_*
で始まります。camel-jetty9
は RFC 暗号スイート名のみをサポートし、すべての SSL_* cipher
はセキュリティー保護されておらず、除外されています。Jetty はすべての SSL_*
暗号を除外するため、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);
このコードは、すべての SSL_*
暗号の除外を削除することで、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>
174.9.3. X509Certificate への参照を取得する方法
Jetty は、次のようにコードからアクセスできる HttpServletRequest に証明書への参照を格納します。
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 ソケットコネクターに適用される一般的なプロパティーを設定できるようになりました (これは、上記のようにポート番号をエントリーとして明示的に設定するものではありません)。
<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>
174.9.5. Obtaining X-Forwarded-For header with HttpServletRequest.getRemoteAddr()
HTTP 要求が Apache サーバーによって処理され、mod_proxy を使用して jetty に転送される場合、元のクライアント IP アドレスは X-Forwarded-For ヘッダーにあり、HttpServletRequest.getRemoteAddr () は Apache プロキシーのアドレスを返します。
Jetty には、X-Forwarded-For から値を取得して HttpServletRequest remoteAddr プロパティーに配置する forwarded プロパティーがあります。このプロパティーは、エンドポイント設定から直接利用することはできませんが、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>
これは、既存の Apache サーバーがドメインの TLS 接続を処理し、それらを内部でアプリケーションサーバーにプロキシーする場合に特に役立ちます。