173.8. 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);
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"/> ...
...
<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/"/>
<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>
<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>
<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>
<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 がリッスンするように設定したポートです。
173.8.1. 一般的な 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>
<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>
173.8.2. 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")
173.8.3. 一般的な 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>
<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>
173.8.4. 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>
<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 接続を処理し、それらを内部でアプリケーションサーバーにプロキシーする場合に特に役立ちます。