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

끝점의 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 모드에서 실행되도록 하려면 https:// 접두사---로 URI를 포맷합니다. 예를 들면 다음과 같습니다.

<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 인증서(effectively, 공개 키) 및 관련 개인 키를 저장합니다.
  • Jetty.ssl.password 저장소 암호(키 저장소 파일의 액세스에 필요한 암호)는 키 저장소 명령의 -store pass 옵션에 제공된 암호와 같습니다.
  • Je tty.ssl.keypassword 키 암호(키 저장소에서 인증서의 키 항목에 액세스하는 데 사용되는 키 암호) (이는 키 저장소 명령의 -key pass 옵션에 제공된 암호와 동일합니다).

Camel 2.3 이후

  • org.eclipse.jetty.ssl.keystore 는 키 항목에 Jetty 서버의 자체 X.509 인증서가 포함된 Java 키 저장소 파일의 위치를 지정합니다. 키 항목은 X.509 인증서(effectively, 공개 키) 및 관련 개인 키를 저장합니다.
  • org.eclipse.jetty.ssl.password 저장소 암호를 저장합니다(키 저장소 명령의 - store pass 옵션에 제공된 암호와 동일).
  • org.eclipse.jetty.ssl.keypassword 키 암호(키 저장소에서 인증서의 키 항목에 액세스하는 데 사용되는 키 암호) (이는 키 저장소 명령의 -key pass 옵션에 제공된 암호와 동일합니다).

Jetty 끝점에서 SSL을 구성하는 방법에 대한 자세한 내용은 Jetty 사이트에서 다음 문서를 참조하십시오. http://docs.codehaus.org/display/JETTY/How+to+configure+SSL

일부 SSL 속성은 Camel에 의해 직접 노출되지 않지만 Camel은 기본 SslSocketConnector를 노출하지 않으므로 클라이언트 인증서가 필요하거나 클라이언트가 인증서가 필요하지 않은 상호 인증에 대해ClientAuth와 같은 속성을 설정할 수 있습니다. 다양한 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를 구성하는 포트입니다.

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_* 암호 는 안전하지 않으며 제외됩니다. 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에 정의된 제외 암호를 재정의합니다.