173.9. SSL 지원 (HTTPS)
JSSE 설정 사용
Camel 2.8부터, 구성 요소는 Camel JSSE ConfigurationECDHE를 통해 SSL/TLS 구성을 지원합니다. 이 유틸리티는 작성해야 하는 구성 요소 특정 코드의 양을 크게 줄이고 끝점 및 구성 요소 수준에서 구성할 수 있습니다. 다음 예제에서는 utility를ECDHEty 구성 요소와 함께 사용하는 방법을 보여줍니다.
구성 요소의 프로그래밍 방식 구성
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"/>
...
직접 구성
ty는 즉시 사용 가능한 SSL 지원을 제공합니다. SSL 모드에서 실행하도록 하려면 다음과 같이 https:// 접두사--를 사용하여 URI 형식을 지정하기만 하면 됩니다.
<from uri="jetty:https://0.0.0.0/myapp/myservice/"/>
또한ty는 키 저장소를 로드할 위치와 올바른 SSL 인증서를 로드하기 위해 사용할 암호를 알아야 합니다. 다음 JVM 시스템 속성을 설정합니다.
Camel 2.2까지
-
4.6.1ty.ssl.keystore키 항목에 서버의 자체 X.509 인증서가 포함된 Java 키 저장소 파일의 위치를 지정합니다. 키 항목은 X.509 인증서( 공개 키)와 연결된 개인 키도 저장합니다. -
ECDHEty.ssl.password는 키 저장소 파일에 액세스하는 데 필요한 저장소 암호(키저장소명령의-storepass옵션에 제공된 암호)와 동일합니다. -
keystore의 인증서
키 항목에 액세스하는 데 사용되는 키 암호(키 저장소 명령의-keypass옵션에 제공된 암호)에 액세스하는 데 사용되는키암호입니다.
Onwards Camel 2.3 이후
-
org.eclipse.jetty.ssl.keystore는 키 항목에 groupty 서버의 자체 X.509 인증서가 포함된 Java 키 저장소 파일의 위치를 지정합니다. 키 항목은 X.509 인증서( 공개 키)와 연결된 개인 키도 저장합니다. -
org.eclipse.jetty.ssl.password는 키 저장소 파일에 액세스하는 데 필요한 저장소 암호(키 저장소명령의-storepass옵션에 제공된 암호와 동일합니다). -
org.eclipse.jetty.ssl.keypassword키 저장소의 인증서 키 항목에 액세스하는 데 사용되는 키 암호입니다(키저장소명령의-keypass옵션에 제공된 암호와 동일).
Multusty 엔드포인트에서 SSL을 구성하는 방법에 대한 자세한 내용은 http://docs.codehaus.org/display/JETTY/How+to+configure+SSL에서 다음 설명서를 참조하십시오.
일부 SSL 속성은 Camel에서 직접 노출되지 않지만 Camel은 기본 SslSocketConnector를 노출하므로 클라이언트가 인증서가 필요하지 않지만 인증서가 필요하지 않은 상호 인증에 클라이언트 인증서 또는 wantClientAuth가 필요한 상호 인증에 needClientAuth와 같은 속성을 설정할 수 있습니다. 다양한 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>
위 맵에서 키로 사용하는 값은 수신 대기하도록 구성된 포트입니다.
173.9.1. IBM Java에서 TLS 보안을 사용하여 camel-jetty9 구성 링크 복사링크가 클립보드에 복사되었습니다!
camel-jetty9 구성 요소의 기본 TLS 보안 설정은 IBM Java VM과 호환되지 않습니다. IBM Java의 모든 암호는 SSL_* 접두사 로 시작하고 TLS 프로토콜의 암호도 SSL_* 로 시작합니다. Camel-jetty9 는 RFC Cipher Suite 이름만 지원하며 모든 SSL_* 암호 는 안전하지 않으며 제외됩니다. ECDHEty는 모든 SSL_* 암호를 제외하므로 TLS 1.2에 사용할 수 있는 협상 가능한 암호가 없으며 연결이 실패합니다. Multusty의 ssl 컨텍스트의 동작을 변경할 수 없기 때문에 해결방법은 Multusty9 구성 요소에서 기본 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_* 암호를 제외하여 에서 정의된 제외된 암호를 재정의합니다.
173.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>
173.9.3. X509Certificate에 대한 참조를 얻는 방법 링크 복사링크가 클립보드에 복사되었습니다!
ECDHEty는 다음과 같이 코드에서 액세스할 수 있는 certificate 참조를ECDHEServletRequest에 저장합니다.
HttpServletRequest req = exchange.getIn().getBody(HttpServletRequest.class);
X509Certificate cert = (X509Certificate) req.getAttribute("javax.servlet.request.X509Certificate")
173.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>
173.9.5. ECDHEServletRequest.getRemoteAddr()를 사용하여 X-Forwarded-For 헤더 가져오기 링크 복사링크가 클립보드에 복사되었습니다!
HTTP 요청이 Apache 서버에서 처리되고 mod_proxy를 사용하여 jetty로 전달되면 원래 클라이언트 IP 주소는 X-Forwarded-For 헤더에 있으며, /ServletRequest.getRemoteAddr()는 Apache 프록시의 주소를 반환합니다.
ECDHEty는 X-Forwarded-For 값을 가져와 이를ECDHEServletRequest 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>
이 기능은 기존 Apache 서버가 도메인에 대한 TLS 연결을 처리하고 내부적으로 애플리케이션 서버에 프록시할 때 특히 유용합니다.