Apache CXF 보안 가이드

Red Hat Fuse 7.9

서비스 및 소비자 보호

Red Hat Fuse Documentation Team

초록

이 가이드에서는 Apache CXF 보안 기능을 사용하는 방법을 설명합니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 용어를 교체하기 위해 최선을 다하고 있습니다. 먼저 마스터(master), 슬레이브(slave), 블랙리스트(blacklist), 화이트리스트(whitelist) 등 네 가지 용어를 교체하고 있습니다. 이러한 변경 작업은 작업 범위가 크므로 향후 여러 릴리스에 걸쳐 점차 구현할 예정입니다. 자세한 내용은 CTO Chris Wright의 메시지에서 참조하십시오.

1장. HTTP 호환 바인딩에 대한 보안

초록

이 장에서는 Apache CXF HTTP 전송에서 지원하는 보안 기능에 대해 설명합니다. 이러한 보안 기능은 HTTP 전송 위에 계층화할 수 있는 모든 Apache CXF 바인딩에서 사용할 수 있습니다.

1.1. 개요

이 섹션에서는 일반적으로 HTTPS라는 조합인 SSL/TLS 보안을 사용하도록 HTTP 전송을 구성하는 방법을 설명합니다. Apache CXF에서 HTTPS 보안은 XML 구성 파일에 설정을 지정하여 구성됩니다.

주의

SSL/TLS 보안을 활성화하는 경우 Poodle 취약점(CVE-2014-3566) 으로부터 보호하기 위해 SSLv3 프로토콜을 명시적으로 비활성화해야 합니다. 자세한 내용은 JBoss Fuse 6.x 및 JBoss A-MQ 6.x에서 SSLv3 비활성화 를 참조하십시오.

다음 주제는 이 장에서 설명합니다.

1.2. X.509 인증서 생성

SSL/TLS 보안을 사용하기 위한 기본 전제 조건은 서버 애플리케이션을 식별하는 데 X.509 인증서 컬렉션을 사용할 수 있고 선택적으로 클라이언트 애플리케이션을 식별하는 것입니다. 다음 방법 중 하나로 X.509 인증서를 생성할 수 있습니다.

참고

HTTPS 프로토콜은 서버가 배포된 호스트 이름과 일치하도록 인증서의 ID가 필요한 URL 무결성 검사를 수행해야 합니다. 자세한 내용은 2.4절. “HTTPS 인증서에 대한 특수 요구 사항” 을 참조하십시오.

1.3. 인증서 형식

Java 런타임에서는 X.509 인증서 체인과 신뢰할 수 있는 CA 인증서를 Java 키 저장소 형태로 배포해야 합니다. 자세한 내용은 3장. HTTPS 구성 을 참조하십시오.

1.4. HTTPS 활성화

WSDL 끝점에서 HTTPS를 활성화하기 위한 전제 조건은 엔드포인트 주소를 HTTPS URL로 지정해야 한다는 것입니다. 끝점 주소가 설정된 두 개의 다른 위치가 있으며 모두 HTTPS URL을 사용하도록 수정해야 합니다.

  • WSDL 계약에 지정된 HTTPS - 예 1.1. “WSDL에서 HTTPS 지정” 에 표시된 대로 WSDL 계약에 있는 엔드포인트 주소를 https: 접두사가 있는 URL로 지정해야 합니다.

    예 1.1. WSDL에서 HTTPS 지정

    <wsdl:definitions name="HelloWorld"
                    targetNamespace="http://apache.org/hello_world_soap_http"
                    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
                    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" ... >
      ...
      <wsdl:service name="SOAPService">
        <wsdl:port binding="tns:Greeter_SOAPBinding"
                   name="SoapPort">
          <soap:address location="https://localhost:9001/SoapContext/SoapPort"/>
        </wsdl:port>
      </wsdl:service>
    </wsdl:definitions>

    soap:address 요소의 location 속성이 HTTPS URL을 사용하도록 구성된 위치. Cryostat 이외의 바인딩의 경우 http:address 요소의 location 속성에 나타나는 URL을 편집합니다.

  • 서버 코드에 지정된 HTTPS - Endpoint.publish() 를 호출하여 서버 코드에 게시된 URL이 예 1.2. “서버 코드에서 HTTPS 지정” 에 표시된 대로 https: 접두사로 정의되었는지 확인해야 합니다.

    예 1.2. 서버 코드에서 HTTPS 지정

    // Java
    package demo.hw_https.server;
    import javax.xml.ws.Endpoint;
    
    public class Server {
      protected Server() throws Exception {
        Object implementor = new GreeterImpl();
        String address = "https://localhost:9001/SoapContext/SoapPort";
        Endpoint.publish(address, implementor);
      }
      ...
      }

1.5. 인증서가 없는 HTTPS 클라이언트

예를 들어 예 1.3. “인증서가 없는 샘플 HTTPS 클라이언트” 에 표시된 대로 인증서가 없는 보안 HTTPS 클라이언트의 구성을 고려하십시오.

예 1.3. 인증서가 없는 샘플 HTTPS 클라이언트

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:sec="http://cxf.apache.org/configuration/security"
       xmlns:http="http://cxf.apache.org/transports/http/configuration"
       xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
       xsi:schemaLocation="...">

    <http:conduit name="{http://apache.org/hello_world_soap_http}SoapPort.http-conduit">
      <http:tlsClientParameters>
        <sec:trustManagers>
          <sec:keyStore type="JKS" password="password"
                        file="certs/truststore.jks"/>
        </sec:trustManagers>
        <sec:cipherSuitesFilter>
        <sec:include>.*_WITH_3DES_.*</sec:include>
        <sec:include>.*_WITH_DES_.*</sec:include>
        <sec:exclude>.*_WITH_NULL_.*</sec:exclude>
        <sec:exclude>.*_DH_anon_.*</sec:exclude>
      </sec:cipherSuitesFilter>
    </http:tlsClientParameters>
  </http:conduit>

</beans>

이전 클라이언트 구성은 다음과 같이 설명되어 있습니다.

TLS 보안 설정은 특정 WSDL 포트에 정의됩니다. 이 예에서 구성 중인 WSDL 포트에는 QName {http://apache.org/hello_world_soap_http}SoapPort.

http:tlsClientParameters 요소에는 클라이언트의 모든 TLS 구성 세부 정보가 포함됩니다.

sec:trustManagers 요소는 신뢰할 수 있는 CA 인증서 목록을 지정하는 데 사용됩니다(클라이언트는 이 목록을 사용하여 서버 측에서 수신된 인증서를 신뢰 여부를 결정합니다).

sec:keyStore 요소의 file 속성은 하나 이상의 신뢰할 수 있는 CA 인증서를 포함하는 Java 키 저장소 파일 truststore.jks 를 지정합니다. password 속성은 키 저장소인 truststore.jks 에 액세스하는 데 필요한 암호를 지정합니다. 3.2.2절. “HTTPS를 위한 신뢰할 수 있는 CA 인증서 지정”을 참조하십시오.

참고

file 속성 대신 resource 속성(클래스 경로에 키 저장소 파일이 제공됨) 또는 url 특성을 사용하여 키 저장소의 위치를 지정할 수 있습니다. 특히 리소스 속성은 OSGi 컨테이너에 배포된 애플리케이션과 함께 사용해야 합니다. 신뢰할 수 없는 출처에서 신뢰 저장소를 로드하지 않도록 주의해야 합니다.

sec:cipherSuitesFilter 요소는 클라이언트가 TLS 연결에 사용할 암호화 제품군의 선택을 좁히는 데 사용할 수 있습니다. 자세한 내용은 4장. HTTPS Cipher Suites 구성 을 참조하십시오.

1.6. 인증서가 있는 HTTPS 클라이언트

자체 인증서를 갖도록 구성된 보안 HTTPS 클라이언트를 고려하십시오. 예 1.4. “인증서가 있는 샘플 HTTPS 클라이언트” 이러한 샘플 클라이언트를 구성하는 방법을 보여줍니다.

예 1.4. 인증서가 있는 샘플 HTTPS 클라이언트

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:sec="http://cxf.apache.org/configuration/security"
 xmlns:http="http://cxf.apache.org/transports/http/configuration"
 xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
 xsi:schemaLocation="...">

  <http:conduit name="{http://apache.org/hello_world_soap_http}SoapPort.http-conduit">
    <http:tlsClientParameters>
      <sec:trustManagers>
          <sec:keyStore type="JKS" password="password"
               file="certs/truststore.jks"/>
      </sec:trustManagers>
      <sec:keyManagers keyPassword="password">
           <sec:keyStore type="JKS" password="password"
                file="certs/wibble.jks"/>
      </sec:keyManagers>
      <sec:cipherSuitesFilter>
        <sec:include>.*_WITH_3DES_.*</sec:include>
        <sec:include>.*_WITH_DES_.*</sec:include>
        <sec:exclude>.*_WITH_NULL_.*</sec:exclude>
        <sec:exclude>.*_DH_anon_.*</sec:exclude>
      </sec:cipherSuitesFilter>
    </http:tlsClientParameters>
   </http:conduit>

    <bean id="cxf" class="org.apache.cxf.bus.CXFBusImpl"/>
</beans>

이전 클라이언트 구성은 다음과 같이 설명되어 있습니다.

sec:keyManagers 요소는 X.509 인증서와 개인 키를 클라이언트에 연결하는 데 사용됩니다. keyPasswod 속성에 의해 지정된 암호는 인증서의 개인 키를 해독하는 데 사용됩니다.

sec:keyStore 요소는 X.509 인증서와 Java 키 저장소에 저장된 개인 키를 지정하는 데 사용됩니다. 이 샘플은 키 저장소가 JKS(Java Keystore 형식)임을 선언합니다.

file 속성은 키 항목에 클라이언트의 X.509 인증서 체인 및 개인 키가 포함된 키 저장소 파일 wibble.jks. password 속성은 키 저장소의 콘텐츠에 액세스하는 데 필요한 키 저장소 암호를 지정합니다.

키 저장소 파일에는 하나의 키 항목이 포함되어 있으므로 항목을 식별하기 위해 키 별칭을 지정할 필요가 없습니다. 그러나 여러 키 항목이 있는 키 저장소 파일을 배포하는 경우 다음과 같이 sec:certAlias 요소를 http:tlsClientParameters 요소의 자식으로 추가하여 이 경우 키를 지정할 수 있습니다.

<http:tlsClientParameters>
    ...
    <sec:certAlias>CertAlias</sec:certAlias>
    ...
</http:tlsClientParameters>

키 저장소 파일을 생성하는 방법에 대한 자세한 내용은 2.5.3절. “CA를 사용하여 Java 키 저장소에서 서명된 인증서 생성” 을 참조하십시오.

참고

file 속성 대신 resource 속성(클래스 경로에 키 저장소 파일이 제공됨) 또는 url 특성을 사용하여 키 저장소의 위치를 지정할 수 있습니다. 특히 리소스 속성은 OSGi 컨테이너에 배포된 애플리케이션과 함께 사용해야 합니다. 신뢰할 수 없는 출처에서 신뢰 저장소를 로드하지 않도록 주의해야 합니다.

1.7. HTTPS 서버 구성

클라이언트가 X.509 인증서를 제공해야 하는 보안 HTTPS 서버를 고려해 보십시오. 예 1.5. “샘플 HTTPS 서버 구성” 이러한 서버를 구성하는 방법을 보여줍니다.

예 1.5. 샘플 HTTPS 서버 구성

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sec="http://cxf.apache.org/configuration/security"
xmlns:http="http://cxf.apache.org/transports/http/configuration"
xmlns:httpj="http://cxf.apache.org/transports/http-jetty/configuration"
xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
xsi:schemaLocation="...">

  <httpj:engine-factory bus="cxf">
   <httpj:engine port="9001">
    <httpj:tlsServerParameters secureSocketProtocol="TLSv1">
      <sec:keyManagers keyPassword="password">
           <sec:keyStore type="JKS" password="password"
                file="certs/cherry.jks"/>
      </sec:keyManagers>
      <sec:trustManagers>
          <sec:keyStore type="JKS" password="password"
               file="certs/truststore.jks"/>
      </sec:trustManagers>
      <sec:cipherSuitesFilter>
        <sec:include>.*_WITH_3DES_.*</sec:include>
        <sec:include>.*_WITH_DES_.*</sec:include>
        <sec:exclude>.*_WITH_NULL_.*</sec:exclude>
        <sec:exclude>.*_DH_anon_.*</sec:exclude>
      </sec:cipherSuitesFilter>
      <sec:clientAuthentication want="true" required="true"/>
    </httpj:tlsServerParameters>
   </httpj:engine>
  </httpj:engine-factory>

</beans>

이전 서버 구성은 다음과 같이 설명되어 있습니다.

bus 속성은 관련 CXF Bus 인스턴스를 참조합니다. 기본적으로 ID가 cxf 인 CXF 버스 인스턴스는 Apache CXF 런타임에서 자동으로 생성됩니다.

서버 측에서 TLS는 각 WSDL 포트에 대해 구성되지 않습니다. 각 WSDL 포트를 구성하는 대신 TLS 보안 설정은 특정 TCP 포트에 적용되며 이 예에서는 9001 입니다. 따라서 이 TCP 포트를 공유하는 모든 WSDL 포트는 동일한 TLS 보안 설정으로 구성됩니다.

http:tlsServerParameters 요소에는 서버의 모든 TLS 구성 세부 정보가 포함됩니다.

sec:keyManagers 요소는 X.509 인증서와 개인 키를 서버에 연결하는 데 사용됩니다. keyPasswod 속성에 의해 지정된 암호는 인증서의 개인 키를 해독하는 데 사용됩니다.

sec:keyStore 요소는 X.509 인증서와 Java 키 저장소에 저장된 개인 키를 지정하는 데 사용됩니다. 이 샘플은 키 저장소가 JKS(Java Keystore 형식)임을 선언합니다.

file 속성은 키 항목에 클라이언트의 X.509 인증서 체인과 개인 키가 포함된 키 저장소 파일 cherry.jks 를 지정합니다. password 속성은 키 저장소의 콘텐츠에 액세스하는 데 필요한 키 저장소 암호를 지정합니다.

키 저장소 파일에는 하나의 키 항목이 포함되어 있으므로 항목을 식별하기 위해 키 별칭을 지정할 필요가 없습니다. 그러나 여러 키 항목이 있는 키 저장소 파일을 배포하는 경우 다음과 같이 sec:certAlias 요소를 http:tlsClientParameters 요소의 자식으로 추가하여 이 경우 키를 지정할 수 있습니다.

<http:tlsClientParameters>
    ...
    <sec:certAlias>CertAlias</sec:certAlias>
    ...
</http:tlsClientParameters>
참고

file 속성 대신 resource 속성 또는 url 속성을 사용하여 키 저장소의 위치를 지정할 수 있습니다. 신뢰할 수 없는 출처에서 신뢰 저장소를 로드하지 않도록 주의해야 합니다.

이러한 키 저장소 파일을 생성하는 방법에 대한 자세한 내용은 2.5.3절. “CA를 사용하여 Java 키 저장소에서 서명된 인증서 생성” 을 참조하십시오.

sec:trustManagers 요소는 신뢰할 수 있는 CA 인증서 목록을 지정하는 데 사용됩니다(서버는 이 목록을 사용하여 클라이언트에서 제공하는 인증서를 신뢰 여부를 결정합니다).

sec:keyStore 요소의 file 속성은 하나 이상의 신뢰할 수 있는 CA 인증서를 포함하는 Java 키 저장소 파일 truststore.jks 를 지정합니다. password 속성은 키 저장소인 truststore.jks 에 액세스하는 데 필요한 암호를 지정합니다. 3.2.2절. “HTTPS를 위한 신뢰할 수 있는 CA 인증서 지정”을 참조하십시오.

참고

file 속성 대신 resource 속성 또는 url 속성을 사용하여 키 저장소의 위치를 지정할 수 있습니다.

sec:cipherSuitesFilter 요소는 서버가 TLS 연결에 사용할 암호화 제품군의 선택을 좁히는 데 사용할 수 있습니다. 자세한 내용은 4장. HTTPS Cipher Suites 구성 을 참조하십시오.

sec:clientAuthentication 요소는 클라이언트 인증서의 프레젠테이션에 대한 서버의 disposition를 결정합니다. 요소에는 다음과 같은 속성이 있습니다.

  • want attribute-If true (기본값) 서버는 TLS 핸드셰이크 중에 X.509 인증서를 제공하도록 클라이언트를 요청합니다. false 인 경우 서버에서 X.509 인증서를 제공하도록 클라이언트를 요청하지 않습니다.
  • required attribute-If true, 서버는 클라이언트가 TLS 핸드셰이크 중에 X.509 인증서를 제공하지 못하는 경우 예외를 발생시킵니다. false (기본값)인 경우 클라이언트가 X.509 인증서를 제공하지 않으면 예외가 발생하지 않습니다.

2장. 인증서 관리

초록

TLS 인증은 X.509 인증서(애플리케이션 오브젝트를 인증하는 일반적이고 안전하며 신뢰할 수 있는 인증 방법)를 사용합니다. Red Hat Fuse 애플리케이션을 식별하는 X.509 인증서를 생성할 수 있습니다.

2.1. X.509 인증서란 무엇입니까?

2.1.1. 인증서의 역할

X.509 인증서는 이름을 공개 키 값에 바인딩합니다. 인증서의 역할은 공개 키를 X.509 인증서에 포함된 ID와 연결하는 것입니다.

2.1.2. 공개 키의 무결성

보안 애플리케이션의 인증은 애플리케이션 인증서의 공개 키 값의 무결성에 따라 달라집니다. 공개 키를 자체 공개 키로 교체하는 경우 true 애플리케이션을 가장하고 안전한 데이터에 액세스할 수 있습니다.

이러한 유형의 공격을 방지하려면 모든 인증서에 CA( 인증 기관 )에서 서명해야 합니다. CA는 인증서에 공개 키 값의 무결성을 확인하는 신뢰할 수 있는 노드입니다.

2.1.3. 디지털 서명

CA는 인증서에 디지털 서명을 추가하여 인증서에 서명합니다. 디지털 서명은 CA의 개인 키로 인코딩된 메시지입니다. CA의 공개 키는 CA의 인증서를 배포하여 애플리케이션에 사용할 수 있습니다. 애플리케이션은 CA의 공개 키로 CA의 디지털 서명을 디코딩하여 인증서가 유효한 서명인지 확인합니다.

주의

제공된 데모 인증서는 자체 서명된 인증서입니다. 이러한 인증서는 모든 사용자가 개인 키에 액세스할 수 있기 때문에 안전하지 않습니다. 시스템을 보호하려면 신뢰할 수 있는 CA에서 서명한 새 인증서를 생성해야 합니다.

2.1.4. X.509 인증서의 콘텐츠

X.509 인증서에는 인증서 주체 및 인증서 발행자(인증서를 발급한 CA)에 대한 정보가 포함되어 있습니다. 인증서는 네트워크에서 보내거나 받을 수 있는 메시지를 설명하는 표준 구문인 Abstract Syntax Notation One (ASN.1)로 인코딩됩니다.

인증서의 역할은 ID를 공개 키 값과 연결하는 것입니다. 자세한 내용은 인증서에 다음이 포함됩니다.

  • 인증서 소유자를 식별하는 제목 고유 이름(DN) 입니다.
  • 주체와 연결된 공개 키 입니다.
  • X.509 버전 정보.
  • 인증서를 고유하게 식별하는 일련 번호입니다.
  • 인증서를 발급한 CA를 식별하는 발행자 DN 입니다.
  • 발행자의 디지털 서명입니다.
  • 인증서에 서명하는 데 사용되는 알고리즘에 대한 정보입니다.
  • 일부 선택적 X.509 v.3 확장 기능(예: CA 인증서와 최종 고유 인증서를 구분하는 확장 기능이 있습니다.

2.1.5. 고유 이름

DN은 보안 컨텍스트에서 자주 사용되는 범용 X.500 식별자입니다.

DN에 대한 자세한 내용은 부록 A. ASN.1 및 Distinguished Names 을 참조하십시오.

2.2. 인증 기관

2.2.1. 인증 기관 소개

CA는 인증서를 생성하고 관리하기 위한 툴 세트와 생성된 모든 인증서가 포함된 데이터베이스로 구성됩니다. 시스템을 설정할 때는 요구 사항에 충분히 안전한 적절한 CA를 선택하는 것이 중요합니다.

다음 두 가지 유형의 CA를 사용할 수 있습니다.

  • 상용 CA는 많은 시스템의 인증서에 서명하는 회사입니다.
  • 프라이빗 CA는 시스템의 인증서에만 서명하는 데 설정하고 사용하는 신뢰할 수 있는 노드입니다.

2.2.2. 상용 인증 기관

2.2.2.1. 인증서에 서명

다양한 상용 CA를 사용할 수 있습니다. 상용 CA를 사용하여 인증서에 서명하는 메커니즘은 선택한 CA에 따라 다릅니다.

2.2.2.2. 상용 CA의 이점

상용 CA의 장점은 종종 많은 수의 사람이 신뢰할 수 있다는 것입니다. 조직 외부의 시스템에서 애플리케이션을 사용할 수 있도록 설계된 경우 상용 CA를 사용하여 인증서에 서명합니다. 애플리케이션이 내부 네트워크 내에서 사용할 경우 개인 CA가 적합할 수 있습니다.

2.2.2.3. CA 선택 기준

상용 CA를 선택하기 전에 다음 기준을 고려하십시오.

  • 상용 CA의 인증서 서명 정책은 무엇입니까?
  • 애플리케이션이 내부 네트워크에서만 사용할 수 있도록 설계되었습니까?
  • 상용 CA에 가입하는 비용에 비해 개인 CA를 설정하는 데 드는 잠재적 비용은 무엇입니까?

2.2.3. 개인 인증 기관

2.2.3.1. CA 소프트웨어 패키지 선택

시스템의 인증서에 서명해야 하는 경우 개인 CA를 설정합니다. 개인 CA를 설정하려면 인증서를 생성하고 서명하기 위한 유틸리티를 제공하는 소프트웨어 패키지에 액세스해야 합니다. 이 유형의 여러 패키지를 사용할 수 있습니다.

2.2.3.2. OpenSSL 소프트웨어 패키지

개인 CA를 설정할 수 있는 소프트웨어 패키지 중 하나는 OpenSSL, http://www.openssl.org 입니다. OpenSSL 패키지에는 인증서를 생성하고 서명하기 위한 기본 명령줄 유틸리티가 포함되어 있습니다. OpenSSL 명령줄 유틸리티에 대한 전체 문서는 http://www.openssl.org/docs 에서 확인할 수 있습니다.

2.2.3.3. OpenSSL을 사용하여 개인 CA 설정

개인 CA를 설정하려면 2.5절. “자체 인증서 생성” 의 지침을 참조하십시오.

2.2.3.4. 개인 인증 기관을 위한 호스트 선택

호스트를 선택하는 것은 개인 CA를 설정하는 데 중요한 단계입니다. CA 호스트와 연결된 보안 수준은 CA에서 서명한 인증서와 관련된 신뢰 수준을 결정합니다.

Red Hat Fuse 애플리케이션 개발 및 테스트에서 사용할 CA를 설정하는 경우 애플리케이션 개발자가 액세스할 수 있는 호스트를 사용합니다. 그러나 CA 인증서 및 개인 키를 생성할 때 보안 중요 애플리케이션이 실행되는 모든 호스트에서 CA 개인 키를 사용하지 마십시오.

2.2.3.5. 보안 예방 조치

배포하려는 애플리케이션의 인증서에 서명하도록 CA를 설정하는 경우 CA 호스트를 최대한 안전하게 설정합니다. 예를 들어 CA를 보호하려면 다음 예방 조치를 취합니다.

  • CA를 네트워크에 연결하지 마십시오.
  • CA에 대한 모든 액세스를 신뢰할 수 있는 제한된 사용자 세트로 제한합니다.
  • radio-frequency 감시로부터 CA를 보호하기 위해 Cryostat-shield를 사용하십시오.

2.3. 인증서 체인

2.3.1. 인증서 체인

인증서 체인은 체인 의 각 인증서가 후속 인증서로 서명하는 일련의 인증서입니다.

그림 2.1. “Certificate Chain of Depth 2” 간단한 인증서 체인의 예를 보여줍니다.

그림 2.1. Certificate Chain of Depth 2

인증서 체인의 깊이 2에는 CA 서명이 하나만 있습니다.

2.3.2. 자체 서명된 인증서

체인의 마지막 인증서는 일반적으로 자체 서명 인증서-a 인증서입니다.

2.3.3. 신뢰 체인

인증서 체인의 목적은 피어 인증서에서 신뢰할 수 있는 CA 인증서로 신뢰 체인을 설정하는 것입니다. CA는 피어 인증서의 ID에 서명하여 사용됩니다. CA가 신뢰할 수 있는 경우(루트 인증서 디렉터리에 CA 인증서 사본이 있는 것으로 표시됨) 서명된 피어 인증서도 신뢰할 수 있습니다.

2.3.4. 여러 CA에서 서명한 인증서

CA 인증서는 다른 CA에서 서명할 수 있습니다. 예를 들어, Progress Software의 재무 부서에 대한 CA에서 애플리케이션 인증서를 서명할 수 있으며, CA는 자체 서명된 상용 CA에 의해 서명됩니다.

그림 2.2. “Certificate Chain of Depth 3” 이 인증서 체인의 모양을 보여줍니다.

그림 2.2. Certificate Chain of Depth 3

인증서 체인의 깊이 3에는 두 개의 CA 서명이 있습니다.

2.3.5. 신뢰할 수 있는 CA

애플리케이션은 서명 체인에서 CA 인증서 중 하나 이상을 신뢰하는 경우 피어 인증서를 수락할 수 있습니다.

2.4. HTTPS 인증서에 대한 특수 요구 사항

2.4.1. 개요

HTTPS 사양에서는 HTTPS 클라이언트가 서버의 ID를 확인할 수 있어야 합니다. 이는 X.509 인증서를 생성하는 방법에 잠재적으로 영향을 미칠 수 있습니다. 서버 ID를 확인하는 메커니즘은 클라이언트 유형에 따라 다릅니다. 일부 클라이언트는 신뢰할 수 있는 특정 CA에서 서명한 서버 인증서만 수락하여 서버 ID를 확인할 수 있습니다. 또한 클라이언트는 서버 인증서의 콘텐츠를 검사하고 특정 제약 조건을 충족하는 인증서만 허용할 수 있습니다.

애플리케이션별 메커니즘이 없는 경우 HTTPS 사양은 서버 ID를 확인하기 위해 HTTPS URL 무결성 검사 라는 일반 메커니즘을 정의합니다. 이는 웹 브라우저에서 사용하는 표준 메커니즘입니다.

2.4.2. HTTPS URL 무결성 검사

URL 무결성 검사의 기본 개념은 서버 인증서의 ID가 서버 호스트 이름과 일치해야 한다는 것입니다. 이 무결성 검사는 HTTPS에 대한 X.509 인증서를 생성하는 방법에 중요한 영향을 미칩니다. 인증서 ID(일반적으로 인증서 제목 DN의 일반 이름)는 HTTPS 서버가 배포된 호스트 이름과 일치해야 합니다.

URL 무결성 검사는 중간자 공격을 방지하기 위해 설계되었습니다.

2.4.3. reference

HTTPS URL 무결성 검사는 http://www.ietf.org/rfc/rfc2818.txt 의 IETF(Internet Engineering Task Force)에서 게시한 RFC 2818에 의해 지정됩니다.

2.4.4. 인증서 ID를 지정하는 방법

URL 무결성 검사에 사용되는 인증서 ID는 다음 방법 중 하나로 지정할 수 있습니다.

2.4.5. commonName 사용

URL 무결성 검사를 위해 인증서 ID를 지정하는 일반적인 방법은 인증서의 제목 DN에서 CN(일반 이름)을 사용하는 것입니다.

예를 들어 서버가 다음 URL에서 보안 TLS 연결을 지원하는 경우 다음을 수행합니다.

https://www.redhat.com/secure

해당 서버 인증서에는 다음과 같은 제목 DN이 있습니다.

C=IE,ST=Co. Dublin,L=Dublin,O=RedHat,
OU=System,CN=www.redhat.com

여기서 CN이 호스트 이름인 www.redhat.com 로 설정되어 있습니다.

새 인증서에서 제목 DN을 설정하는 방법에 대한 자세한 내용은 2.5절. “자체 인증서 생성” 을 참조하십시오.

2.4.6. subjectAltName 사용(multi-homed 호스트)

인증서 ID에 제목 DN의 일반 이름을 사용하면 한 번에 하나의 호스트 이름만 지정할 수 있는 단점이 있습니다. 그러나 다중 홈 호스트에 인증서를 배포하는 경우 다중 홈 호스트 이름과 함께 인증서를 사용하도록 허용하는 것이 좋습니다. 이 경우 여러 대체 ID가 있는 인증서를 정의해야 하며 subjectAltName 인증서 확장만 사용할 수 있습니다.

예를 들어 다음 호스트 이름 중 하나에 대한 연결을 지원하는 다중 홈 호스트가 있는 경우 다음을 수행합니다.

www.redhat.com
www.jboss.org

그런 다음 이러한 DNS 호스트 이름을 모두 명시적으로 나열하는 subjectAltName 을 정의할 수 있습니다. openssl 유틸리티를 사용하여 인증서를 생성하는 경우 openssl.cnf 구성 파일의 관련 행을 편집하여 다음과 같이 subjectAltName 확장 값을 지정합니다.

subjectAltName=DNS:www.redhat.com,DNS:www.jboss.org

여기서 HTTPS 프로토콜은 subjectAltName 에 나열된 DNS 호스트 이름 중 하나와 서버 호스트 이름과 일치합니다( subjectAltName 이 일반 이름보다 우선함).

HTTPS 프로토콜은 호스트 이름에 와일드카드 문자 \* 도 지원합니다. 예를 들어 다음과 같이 subjectAltName 을 정의할 수 있습니다.

subjectAltName=DNS:*.jboss.org

이 인증서 ID는 도메인 jboss.org 의 세 가지 구성 요소 호스트 이름과 일치합니다.

주의

도메인 이름 앞에 와일드카드 문자를 절대 사용하지 않아야 합니다. 도메인 이름 앞에 있는 점 . . 구분 기호를 입력하는 것을 잊어버려서 실수로 이 작업을 수행하지 않아야 합니다. 예를 들어 *jboss.org 를 지정한 경우 인증서가 *임표 jboss 로 끝나는 *임의* 도메인에서 사용할 수 있습니다.

2.5. 자체 인증서 생성

2.5.1. 사전 요구 사항

2.5.1.1. OpenSSL 유틸리티

이 섹션에 설명된 단계는 OpenSSL 프로젝트의 OpenSSL 명령줄 유틸리티를 기반으로 합니다. OpenSSL 명령줄 유틸리티에 대한 추가 문서는 http://www.openssl.org/docs/ 에서 확인할 수 있습니다.

2.5.1.2. CA 디렉터리 구조 샘플

설명을 위해 CA 데이터베이스에는 다음과 같은 디렉터리 구조가 있다고 가정합니다.

X509CA/ca

X509CA/certs

X509CA/newcerts

X509CA/crl

여기서 X509CA 는 CA 데이터베이스의 상위 디렉터리입니다.

2.5.2. 자체 CA 설정

2.5.2.1. 수행할 하위 단계

이 섹션에서는 자체 개인 CA를 설정하는 방법을 설명합니다. 실제 배포를 위해 CA를 설정하기 전에 2.2.3절. “개인 인증 기관” 에서 추가 노트를 읽으십시오.

자체 CA를 설정하려면 다음 단계를 수행합니다.

2.5.2.2. bin 디렉토리를 PATH에 추가합니다.

보안 CA 호스트에서 OpenSSL bin 디렉토리를 경로에 추가합니다.

Windows

> set PATH=OpenSSLDir\bin;%PATH%

UNIX

% PATH=OpenSSLDir/bin:$PATH; export PATH

이 단계에서는 명령줄에서 openssl 유틸리티를 사용할 수 있습니다.

2.5.2.3. CA 디렉터리 계층 구조 생성

새 CA를 저장할 새 디렉터리 X509CA 를 만듭니다. 이 디렉터리는 CA와 연결된 모든 파일을 보유하는 데 사용됩니다. X509CA 디렉토리에서 다음 디렉터리 계층 구조를 생성합니다.

X509CA/ca

X509CA/certs

X509CA/newcerts

X509CA/crl

2.5.2.4. openssl.cnf 파일을 복사하고 편집합니다.

OpenSSL 설치의 샘플 openssl.cnfX509CA 디렉터리에 복사합니다.

X509CA 디렉터리의 디렉터리 구조를 반영하고 새 CA에서 사용하는 파일을 식별하도록 openssl.cnf 를 편집합니다.

openssl.cnf 파일의 [CA_default] 섹션을 다음과 같이 편집합니다.

#############################################################
[ CA_default ]

dir        = X509CA            # Where CA files are kept
certs      = $dir/certs  # Where issued certs are kept
crl_dir    = $dir/crl          # Where the issued crl are kept
database   = $dir/index.txt    # Database index file
new_certs_dir = $dir/newcerts  # Default place for new certs

certificate   = $dir/ca/new_ca.pem # The CA certificate
serial        = $dir/serial        # The current serial number
crl           = $dir/crl.pem       # The current CRL
private_key   = $dir/ca/new_ca_pk.pem  # The private key
RANDFILE      = $dir/ca/.rand
# Private random number file

x509_extensions = usr_cert  # The extensions to add to the cert
...

이 시점에서 OpenSSL 구성의 다른 세부 정보를 편집하도록 결정할 수 있습니다. 자세한 내용은 http://www.openssl.org/docs/ 을 참조하십시오.

2.5.2.5. CA 데이터베이스 초기화

X509CA 디렉토리에서 serialindex.txt 두 파일을 초기화합니다.

Windows

Windows에서 직렬 파일을 초기화하려면 다음 명령을 입력합니다.

> echo 01 > serial

Windows의 빈 파일 index.txt 를 만들려면 다음과 같이 X509CA 디렉터리의 명령줄에서 Windows 메모장을 시작합니다.

> notepad index.txt

텍스트가 포함된 대화 상자에 대한 응답으로 text.txt 파일을 찾을 수 없습니다. 새 파일을 생성하시겠습니까?, 를 클릭하고 메모장을 닫습니다.

UNIX

UNIX에서 직렬 파일 및 index.txt 파일을 초기화하려면 다음 명령을 입력합니다.

% echo "01" > serial
% touch index.txt

이러한 파일은 CA에서 인증서 파일의 데이터베이스를 유지 관리하는 데 사용됩니다.

참고

index.txt 파일은 공백도 포함하지 않고 처음에 완전히 비어 있어야 합니다.

2.5.2.6. 자체 서명된 CA 인증서 및 개인 키 생성

다음 명령을 사용하여 자체 서명된 새 CA 인증서 및 개인 키를 생성합니다.

openssl req -x509 -new -config X509CA/openssl.cnf -days 365 -out X509CA/ca/new_ca.pem -keyout X509CA/ca/new_ca_pk.pem

이 명령은 CA 개인 키에 대한 패스 문구와 CA 고유 이름의 세부 정보를 입력하라는 메시지를 표시합니다. 예를 들면 다음과 같습니다.

Using configuration from X509CA/openssl.cnf
Generating a 512 bit RSA private key
....++
.++
writing new private key to 'new_ca_pk.pem'
Enter PEM pass phrase:
Verifying password - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be
incorporated into your certificate request.
What you are about to enter is what is called a Distinguished
Name or a DN. There are quite a few fields but you can leave
some blank. For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:IE
State or Province Name (full name) []:Co. Dublin
Locality Name (eg, city) []:Dublin
Organization Name (eg, company) []:Red Hat
Organizational Unit Name (eg, section) []:Finance
Common Name (eg, YOUR name) []:Gordon Brown
Email Address []:gbrown@redhat.com
참고

CA의 보안은 이 단계에서 사용되는 개인 키 파일의 보안 및 개인 키 전달 구문에 따라 달라집니다.

CA 인증서 및 개인 키의 파일 이름과 위치, new_ca.pemnew_ca_pk.pemopenssl.cnf 에 지정된 값과 동일한지 확인해야 합니다(이전 단계 참조).

이제 CA로 인증서에 서명할 준비가 되었습니다.

2.5.3. CA를 사용하여 Java 키 저장소에서 서명된 인증서 생성

2.5.3.1. 수행할 하위 단계

JKS(Java 키 저장소), CertName.jks 에서 인증서를 생성하고 서명하려면 다음 하위 단계를 수행합니다.

2.5.3.2. Java bin 디렉토리를 PATH에 추가합니다.

아직 수행하지 않은 경우 경로에 Java bin 디렉토리를 추가합니다.

Windows

> set PATH=JAVA_HOME\bin;%PATH%

UNIX

% PATH=JAVA_HOME/bin:$PATH; export PATH

이 단계에서는 명령줄에서 keytool 유틸리티를 사용할 수 있습니다.

2.5.3.3. 인증서 및 개인 키 쌍 생성

명령 프롬프트를 열고 키 저장소 파일 KeystoreDir 을 저장하는 디렉터리로 디렉터리를 변경합니다. 다음 명령을 실행합니다.

keytool -genkey -dname "CN=Alice, OU=Engineering, O=Progress, ST=Co. Dublin, C=IE" -validity 365 -alias CertAlias -keypass CertPassword -keystore CertName.jks -storepass CertPassword

-genkey 옵션으로 호출되는 이 keytool 명령은 X.509 인증서 및 일치하는 개인 키를 생성합니다. 인증서와 키는 모두 새로 생성된 키 저장소인 CertName.jks의 키 항목에 배치됩니다. 지정된 키 저장소 CertName.jks 이므로 명령을 실행하기 전에는 존재하지 않아 keytool 에서 새 키 저장소를 암시적으로 생성합니다.

-dname-validity 플래그는 새로 생성된 X.509 인증서의 내용을 정의하여 각각 제목 DN과 만료 날짜를 지정합니다. DN 형식에 대한 자세한 내용은 부록 A. ASN.1 및 Distinguished Names 을 참조하십시오.

제목 DN의 일부 부분은 CA 인증서의 값과 일치해야 합니다( openssl.cnf 파일의 CA 정책 섹션에 지정되어 있음). 기본 openssl.cnf 파일은 다음 항목이 일치해야 합니다.

  • 국가 이름 (C)
  • 시/도 이름(ST)
  • 조직 이름(O)
참고

제약 조건을 준수하지 않으면 OpenSSL CA가 인증서에 서명하지 않습니다( “CSR에 서명” 참조).

2.5.3.4. 인증서 서명 요청 생성

다음과 같이 CertName.jks 인증서에 대한 새 CSR(인증서 서명 요청)을 생성합니다.

keytool -certreq -alias CertAlias -file CertName_csr.pem -keypass CertPassword -keystore CertName.jks -storepass CertPassword

이 명령은 CSR을 CertName_csr.pem 파일로 내보냅니다.

2.5.3.5. CSR에 서명

다음과 같이 CA를 사용하여 CSR에 서명합니다.

openssl ca -config X509CA/openssl.cnf -days 365 -in CertName_csr.pem -out CertName.pem

인증서에 서명하려면 CA 개인 키 전달 문구를 입력해야 합니다( 2.5.2절. “자체 CA 설정”참조).

참고

기본 CA 이외의 CA 인증서를 사용하여 CSR에 서명하려면 -cert-keyfile 옵션을 사용하여 CA 인증서와 개인 키 파일을 각각 지정합니다.

2.5.3.6. PEM 형식으로 변환

서명된 인증서 CertName.pem 을 다음과 같이 PEM 전용 형식으로 변환합니다.

openssl x509 -in CertName.pem -out CertName.pem -outform PEM

2.5.3.7. 파일 연결

다음과 같이 CA 인증서 파일과 CertName.pem 인증서 파일을 연결합니다.

Windows

copy CertName.pem + X509CA\ca\new_ca.pem CertName.chain

UNIX

cat CertName.pem X509CA/ca/new_ca.pem> CertName.chain

2.5.3.8. 전체 인증서 체인으로 키 저장소를 업데이트

다음과 같이 인증서의 전체 인증서 체인을 가져와 키 저장소 CertName.jks 를 업데이트합니다.

keytool -import -file CertName.chain -keypass CertPassword -keystore CertName.jks -storepass CertPassword

2.5.3.9. 필요에 따라 단계를 반복

2~7단계를 반복하여 시스템에 대한 전체 인증서 세트를 생성합니다.

2.5.4. CA를 사용하여 서명된 PKCS#12 인증서 만들기

2.5.4.1. 수행할 하위 단계

2.5.2절. “자체 CA 설정” 에 설명된 대로 개인 CA를 설정한 경우 이제 자체 인증서를 생성하고 서명할 준비가 된 것입니다.

PKCS#12 형식 CertName.p12 에서 인증서를 생성하고 서명하려면 다음 하위 단계를 수행합니다.

2.5.4.2. bin 디렉토리를 PATH에 추가합니다.

아직 수행하지 않은 경우 다음과 같이 OpenSSL bin 디렉토리를 경로에 추가합니다.

Windows

> set PATH=OpenSSLDir\bin;%PATH%

UNIX

% PATH=OpenSSLDir/bin:$PATH; export PATH

이 단계에서는 명령줄에서 openssl 유틸리티를 사용할 수 있습니다.

2.5.4.3. subjectAltName 확장 구성(선택 사항)

인증서가 URL 무결성 검사를 적용하는 HTTPS 서버용이고 다중 홈 호스트 또는 여러 DNS 이름 별칭이 있는 호스트(예: 다중 홈 웹 서버에 인증서를 배포하는 경우)에 서버를 배포하려는 경우입니다. 이 경우 인증서 ID는 여러 호스트 이름과 일치해야 하며 subjectAltName 인증서 확장만 추가할 수 있습니다( 2.4절. “HTTPS 인증서에 대한 특수 요구 사항”참조).

subjectAltName 확장자를 구성하려면 다음과 같이 CA의 openssl.cnf 파일을 편집합니다.

  1. [req] 섹션에 다음 req_extensions 설정을 추가합니다( openssl.cnf 파일에 없는 경우).

    # openssl Configuration File
    ...
    [req]
    req_extensions=v3_req
  2. [v3_req] 섹션 헤더를 추가합니다( openssl.cnf 파일에 아직 없는 경우). [v3_req] 섹션에서 subjectAltName 설정을 추가하거나 수정하여 DNS 호스트 이름 목록으로 설정합니다. 예를 들어 서버 호스트가 대체 DNS 이름인 www.redhat.comjboss.org 를 지원하는 경우 subjectAltName 을 다음과 같이 설정합니다.

    # openssl Configuration File
    ...
    [v3_req]
    subjectAltName=DNS:www.redhat.com,DNS:jboss.org
  3. 적절한 CA 구성 섹션에 copy_extensions 설정을 추가합니다. 인증서 서명에 사용되는 CA 구성 섹션은 다음 중 하나입니다.

    • openssl ca 명령의 -name 옵션에 지정된 섹션
    • [ca] 섹션 아래의 default_ca 설정에서 지정하는 섹션(일반적으로 [CA_default]).

      예를 들어 적절한 CA 구성 섹션이 [CA_default] 인 경우 다음과 같이 copy_extensions 속성을 설정합니다.

      # openssl Configuration File
      ...
      [CA_default]
      copy_extensions=copy

      이 설정을 사용하면 인증서 서명 요청에 있는 인증서 확장이 서명된 인증서로 복사됩니다.

2.5.4.4. 인증서 서명 요청 생성

다음과 같이 CertName.p12 인증서에 대한 새 CSR(인증서 서명 요청)을 생성합니다.

openssl req -new -config X509CA/openssl.cnf -days 365 -out X509CA/certs/CertName_csr.pem -keyout X509CA/certs/CertName_pk.pem

이 명령은 인증서의 개인 키에 대한 패스 문구와 인증서의 고유 이름에 대한 정보를 입력하라는 메시지를 표시합니다.

CSR 고유 이름의 일부 항목은 CA 인증서의 값과 일치해야 합니다( openssl.cnf 파일의 CA 정책 섹션에서 지정됨). 기본 openssl.cnf 파일을 사용하려면 다음 항목이 일치해야 합니다.

  • 국가 이름
  • 시/도 이름
  • 조직 이름

인증서 제목 DN의 일반 이름은 일반적으로 인증서 소유자의 ID를 나타내는 데 사용되는 필드입니다. 일반 이름은 다음 조건을 준수해야 합니다.

  • OpenSSL 인증 기관에서 생성한 모든 인증서에 대해 공통 이름을 구분해야 합니다.
  • HTTPS 클라이언트가 URL 무결성 검사를 구현하는 경우 일반 이름이 인증서를 배포할 호스트의 DNS 이름과 동일한지 확인해야 합니다( 2.4절. “HTTPS 인증서에 대한 특수 요구 사항”참조).
참고

HTTPS URL 무결성 검사의 목적을 위해 subjectAltName 확장이 Common Name보다 우선합니다.

Using configuration from X509CA/openssl.cnf
Generating a 512 bit RSA private key
.++
.++
writing new private key to
      'X509CA/certs/CertName_pk.pem'
Enter PEM pass phrase:
Verifying password - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be
incorporated into your certificate request.
What you are about to enter is what is called a Distinguished
Name or a DN. There are quite a few fields but you can leave
some blank. For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:IE
State or Province Name (full name) []:Co. Dublin
Locality Name (eg, city) []:Dublin
Organization Name (eg, company) []:Red Hat
Organizational Unit Name (eg, section) []:Systems
Common Name (eg, YOUR name) []:Artix
Email Address []:info@redhat.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:password
An optional company name []:Red Hat

2.5.4.5. CSR에 서명

다음과 같이 CA를 사용하여 CSR에 서명합니다.

openssl ca -config X509CA/openssl.cnf -days 365 -in X509CA/certs/CertName_csr.pem -out X509CA/certs/CertName.pem

이 명령에는 new_ca.pem CA 인증서와 연결된 개인 키에 대한 암호 문구가 필요합니다. 예를 들면 다음과 같습니다.

Using configuration from X509CA/openssl.cnf
Enter PEM pass phrase:
Check that the request matches the signature
Signature ok
The Subjects Distinguished Name is as follows
countryName :PRINTABLE:'IE'
stateOrProvinceName :PRINTABLE:'Co. Dublin'
localityName :PRINTABLE:'Dublin'
organizationName :PRINTABLE:'Red Hat'
organizationalUnitName:PRINTABLE:'Systems'
commonName :PRINTABLE:'Bank Server Certificate'
emailAddress :IA5STRING:'info@redhat.com'
Certificate is to be certified until May 24 13:06:57 2000 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

인증서에 서명하려면 CA 개인 키 전달 문구를 입력해야 합니다( 2.5.2절. “자체 CA 설정”참조).

참고

openssl.cnf 파일의 [CA_default] 섹션에 copy_extensions=copy 를 설정하지 않은 경우 서명된 인증서에는 원래 CSR에 있는 인증서 확장 기능이 포함되지 않습니다.

2.5.4.6. 파일 연결

다음과 같이 CA 인증서 파일 CertName.pem 인증서 파일 및 CertName_pk.pem 개인 키 파일을 연결합니다.

Windows

copy X509CA\ca\new_ca.pem + X509CA\certspass:quotes[_CertName_].pem + X509CA\certspass:quotes[_CertName_]_pk.pem X509CA\certspass:quotes[_CertName_]_list.pem

UNIX

cat X509CA/ca/new_ca.pem X509CA/certs/CertName.pem X509CA/certs/CertName_pk.pem > X509CA/certs/CertName_list.pem

2.5.4.7. PKCS#12 파일 생성

다음과 같이 CertName_list.pem 파일에서 PKCS#12 파일을 생성합니다.

openssl pkcs12 -export -in X509CA/certs/CertName_list.pem -out X509CA/certs/CertName.p12 -name "New cert"

PKCS#12 인증서를 암호화하기 위한 암호를 입력하라는 메시지가 표시됩니다. 일반적으로 이 암호는 CSR 암호와 동일합니다. 이 암호는 많은 인증서 리포지토리에 필요합니다.

2.5.4.8. 필요에 따라 단계를 반복

3~6단계를 반복하여 시스템에 대한 전체 인증서 세트를 생성합니다.

1. (선택 사항) subjectAltName 확장을 지웁니다.

특정 호스트 시스템에 대한 인증서를 생성한 후 openssl.cnf 파일에서 subjectAltName 설정을 지워 실수로 다른 인증서 세트에 잘못된 DNS 이름을 할당하지 않는 것이 좋습니다.

openssl.cnf 파일에서 subjectAltName 설정을 주석 처리하고(행 시작 시 # 문자를 추가하여) copy_extensions 설정을 주석 처리합니다.

3장. HTTPS 구성

초록

이 장에서는 HTTPS 엔드포인트를 구성하는 방법을 설명합니다.

3.1. 인증 대체 옵션

3.1.1. 대상 전용 인증

3.1.1.1. 개요

애플리케이션이 대상 전용 인증에 대해 구성되면 대상이 클라이언트에 자체적으로 인증되지만 그림 3.1. “대상 인증만 해당” 에 표시된 대로 클라이언트는 대상 오브젝트에 인증되지 않습니다.

그림 3.1. 대상 인증만 해당

대상 인증에 대한 인증 패턴만 해당

3.1.1.2. 보안 핸드셰이크

애플리케이션을 실행하기 전에 클라이언트 및 서버를 다음과 같이 설정해야 합니다.

보안 핸드셰이크 중에 서버는 인증서 체인을 클라이언트에 보냅니다( 그림 3.1. “대상 인증만 해당”참조). 그런 다음 클라이언트는 신뢰할 수 있는 CA 목록을 검색하여 서버의 인증서 체인에서 CA 인증서 중 하나와 일치하는 CA 인증서를 찾습니다.

3.1.1.3. HTTPS 예

클라이언트 측에는 대상 전용 인증에 필요한 정책 설정이 없습니다. X.509 인증서를 HTTPS 포트와 연결하지 않고 간단히 클라이언트를 구성합니다. 그러나 클라이언트에 신뢰할 수 있는 CA 인증서 목록을 제공해야 합니다( 3.2절. “신뢰할 수 있는 CA 인증서 지정”참조).

서버 측에서 서버의 XML 구성 파일에서 sec:clientAuthentication 요소에 클라이언트 인증이 필요하지 않은지 확인합니다. 이 요소는 생략할 수 있습니다. 이 경우 기본 정책에 클라이언트 인증이 필요하지 않습니다. 그러나 sec:clientAuthentication 요소가 있는 경우 다음과 같이 구성해야 합니다.

<http:destination id="{Namespace}PortName.http-destination">
  <http:tlsServerParameters secureSocketProtocol="TLSv1">
    ...

    <sec:clientAuthentication want="false" required="false"/>
  </http:tlsServerParameters>
</http:destination>

want 속성이 false(기본값)로 설정된 경우 TLS 핸드셰이크 중에 서버에서 클라이언트에서 X.509 인증서를 요청하지 않도록 지정합니다. 또한 required 속성은 false(기본값)로 설정되어 클라이언트 인증서가 TLS 핸드셰이크 중에 예외를 트리거하지 않도록 지정합니다.

참고

want 속성은 true 또는 false 로 설정할 수 있습니다. true 로 설정하면 원하는 설정으로 인해 서버가 TLS 핸드셰이크 중에 클라이언트 인증서를 요청하지만 필요한 특성이 false 로 설정된 경우 인증서가 없는 클라이언트에는 예외가 발생하지 않습니다.

또한 X.509 인증서를 서버의 HTTPS 포트와 연결하고 서버에 신뢰할 수 있는 CA 인증서 목록을 제공해야 합니다( 3.3절. “애플리케이션 자체 인증서 지정” 참조). 3.2절. “신뢰할 수 있는 CA 인증서 지정”

참고

암호화 제품군의 선택은 대상 전용 인증이 지원되는지 여부에 영향을 미칠 수 있습니다( 4장. HTTPS Cipher Suites 구성참조).

3.1.2. 상호 인증

3.1.2.1. 개요

애플리케이션이 상호 인증을 위해 구성되면 대상은 클라이언트에 자신을 인증하고 클라이언트는 대상에 자신을 인증합니다. 이 시나리오는 그림 3.2. “상호 인증” 에 설명되어 있습니다. 이 경우 서버와 클라이언트는 각각 보안 핸드셰이크를 위한 X.509 인증서가 필요합니다.

그림 3.2. 상호 인증

클라이언트와 서버 모두 다른 당사자와 인증

3.1.2.2. 보안 핸드셰이크

애플리케이션을 실행하기 전에 클라이언트 및 서버를 다음과 같이 설정해야 합니다.

TLS 핸드셰이크 중에 서버는 인증서 체인을 클라이언트에 전송하고 클라이언트는 인증서 체인을 서버에 보냅니다. 그림 3.1. “대상 인증만 해당” 을 참조하십시오.

3.1.2.3. HTTPS 예

클라이언트 측에는 상호 인증에 필요한 정책 설정이 없습니다. X.509 인증서를 클라이언트의 HTTPS 포트와 연결하기만 하면 됩니다( 3.3절. “애플리케이션 자체 인증서 지정”참조). 클라이언트에 신뢰할 수 있는 CA 인증서 목록도 제공해야 합니다( 3.2절. “신뢰할 수 있는 CA 인증서 지정”참조).

서버 측에서 서버의 XML 구성 파일에서 클라이언트 인증을 요구 하도록 sec:clientAuthentication 요소가 구성되었는지 확인합니다. 예를 들면 다음과 같습니다.

<http:destination id="{Namespace}PortName.http-destination">
  <http:tlsServerParameters secureSocketProtocol="TLSv1">
    ...
    <sec:clientAuthentication want="true" required="true"/>
  </http:tlsServerParameters>
</http:destination>

want 속성이 true 로 설정된 경우 TLS 핸드셰이크 중에 서버에서 클라이언트에서 X.509 인증서를 요청하도록 지정합니다. required 속성도 true 로 설정되어 클라이언트 인증서가 없으면 TLS 핸드셰이크 중에 예외를 트리거하도록 지정합니다.

또한 X.509 인증서를 서버의 HTTPS 포트와 연결하고 서버에 신뢰할 수 있는 CA 인증서 목록을 제공해야 합니다( 3.3절. “애플리케이션 자체 인증서 지정”참조). 3.2절. “신뢰할 수 있는 CA 인증서 지정”

참고

암호화 제품군의 선택은 상호 인증이 지원되는지 여부에 영향을 미칠 수 있습니다( 4장. HTTPS Cipher Suites 구성참조).

3.2. 신뢰할 수 있는 CA 인증서 지정

3.2.1. 신뢰할 수 있는 CA 인증서를 배포해야 하는 경우

3.2.1.1. 개요

애플리케이션이 SSL/TLS 핸드셰이크 중에 X.509 인증서를 수신하는 경우 애플리케이션은 발급자 CA가 신뢰할 수 있는 CA 인증서 세트 중 하나인지 확인하여 수신된 인증서를 신뢰하지 않는지 여부를 결정합니다. 수신된 X.509 인증서가 애플리케이션의 신뢰할 수 있는 CA 인증서 중 하나에 의해 유효한 서명인 경우 인증서가 신뢰할 수 있는 것으로 간주됩니다. 그렇지 않으면 거부됩니다.

3.2.1.2. 신뢰할 수 있는 CA 인증서를 지정해야 하는 애플리케이션은 무엇입니까?

HTTPS 핸드셰이크의 일부로 X.509 인증서를 수신할 가능성이 있는 모든 애플리케이션은 신뢰할 수 있는 CA 인증서 목록을 지정해야 합니다. 예를 들어 다음과 같은 유형의 애플리케이션이 포함됩니다.

  • 모든 HTTPS 클라이언트입니다.
  • 상호 인증을 지원하는 모든 HTTPS 서버 .

3.2.2. HTTPS를 위한 신뢰할 수 있는 CA 인증서 지정

3.2.2.1. CA 인증서 형식

CA 인증서는 Java 키 저장소 형식으로 제공되어야 합니다.

3.2.2.2. Apache CXF 구성 파일의 CA 인증서 배포

HTTPS 전송을 위해 신뢰할 수 있는 루트 CA를 하나 이상 배포하려면 다음 단계를 수행합니다.

  1. 배포하려는 신뢰할 수 있는 CA 인증서 컬렉션을 어셈블합니다. 신뢰할 수 있는 CA 인증서는 공용 CA 또는 개인 CA에서 가져올 수 있습니다. 자체 CA 인증서를 생성하는 방법에 대한 자세한 내용은 2.5절. “자체 인증서 생성”을 참조하십시오. 신뢰할 수 있는 CA 인증서는 Java 키 저장소 유틸리티와 호환되는 모든 형식(예: PEM 형식)일 수 있습니다. 필요한 것은 모두 인증서 자체입니다. 개인 키와 암호가 필요하지 않습니다.
  2. PEM 형식의 CA 인증서 cacert.pem 이 제공된 경우 다음 명령을 입력하여 JKS 트러스트 저장소(또는 새 신뢰 저장소를 생성)에 인증서를 추가할 수 있습니다.

    keytool -import -file cacert.pem -alias CAAlias -keystore truststore.jks -storepass StorePass

    여기서 CAAliaskeytool 유틸리티를 사용하여 이 특정 CA 인증서에 액세스할 수 있는 편리한 태그입니다. truststore.jks 파일은 CA 인증서가 포함된 키 저장소 파일입니다. 이 파일이 없으면 keytool 유틸리티에서 키를 생성합니다. StorePass 암호는 키 저장소 파일 truststore.jks 에 대한 액세스를 제공합니다.

  3. 필요에 따라 2단계를 반복하여 모든 CA 인증서를 truststore 파일 truststore.jks 에 추가합니다.
  4. 관련 XML 구성 파일을 편집하여 truststore 파일의 위치를 지정합니다. 관련 HTTPS 포트 구성에 sec:trustManagers 요소를 포함해야 합니다.

    예를 들어 다음과 같이 클라이언트 포트를 구성할 수 있습니다.

    <!-- Client port configuration -->
    <http:conduit id="{Namespace}PortName.http-conduit">
      <http:tlsClientParameters>
        ...
        <sec:trustManagers>
          <sec:keyStore type="JKS"
                        password="StorePass"
                        file="certs/truststore.jks"/>
        </sec:trustManagers>
        ...
      </http:tlsClientParameters>
    </http:conduit>

    여기서 truststore에서 JKS 키 저장소 구현을 사용하고 StorePasstruststore.jks 키 저장소에 액세스하는 데 필요한 암호입니다.

    다음과 같이 서버 포트를 구성합니다.

    <!-- Server port configuration -->
    <http:destination id="{Namespace}PortName.http-destination">
      <http:tlsServerParameters secureSocketProtocol="TLSv1">
        ...
        <sec:trustManagers>
          <sec:keyStore type="JKS"
                        password="StorePass"
                        file="certs/truststore.jks"/>
        </sec:trustManagers>
        ...
      </http:tlsServerParameters>
    </http:destination>
    주의

    신뢰 저장소를 포함하는 디렉터리(예: X509Deploy/truststores/)는 보안 디렉터리여야 합니다(즉, 관리자만 쓰기 가능).

3.3. 애플리케이션 자체 인증서 지정

3.3.1. HTTPS용 자체 인증서 배포

3.3.1.1. 개요

HTTPS 전송으로 작업할 때 애플리케이션의 인증서는 XML 구성 파일을 사용하여 배포됩니다.

3.3.1.2. 절차

HTTPS 전송을 위해 애플리케이션 자체 인증서를 배포하려면 다음 단계를 수행합니다.

  1. Java 키 저장소 형식 CertName.jks 로 애플리케이션 인증서를 가져옵니다. Java 키 저장소 형식으로 인증서를 생성하는 방법에 대한 자세한 내용은 2.5.3절. “CA를 사용하여 Java 키 저장소에서 서명된 인증서 생성” 을 참조하십시오.

    참고

    일부 HTTPS 클라이언트(예: 웹 브라우저)는 서버가 배포된 호스트 이름과 일치하도록 인증서의 ID가 필요한 URL 무결성 검사를 수행합니다. 자세한 내용은 2.4절. “HTTPS 인증서에 대한 특수 요구 사항” 을 참조하십시오.

  2. 인증서의 키 저장소 CertName.jks 를 배포 호스트의 인증서 디렉터리에 복사합니다(예: X509Deploy/certs ).

    인증서 디렉터리는 관리자 및 기타 권한 있는 사용자만 쓸 수 있는 보안 디렉터리여야 합니다.

  3. 관련 XML 구성 파일을 편집하여 인증서 키 저장소 CertName.jks 의 위치를 지정합니다. 관련 HTTPS 포트 구성에 sec:keyManagers 요소를 포함해야 합니다.

    예를 들어 다음과 같이 클라이언트 포트를 구성할 수 있습니다.

    <http:conduit id="{Namespace}PortName.http-conduit">
      <http:tlsClientParameters>
        ...
        <sec:keyManagers keyPassword="CertPassword">
          <sec:keyStore type="JKS"
                        password="KeystorePassword"
                        file="certs/CertName.jks"/>
        </sec:keyManagers>
        ...
      </http:tlsClientParameters>
    </http:conduit>

    keyPassword 속성이 인증서의 개인 키(즉, CertPassword)를 해독하는 데 필요한 암호를 지정하고, truststore에서 JKS 키 저장소 구현을 사용하는 유형 특성 사양은 CertName.jks 키 저장소(즉, KeystorePassword)에 액세스하는 데 필요한 암호를 지정합니다.

    다음과 같이 서버 포트를 구성합니다.

    <http:destination id="{Namespace}PortName.http-destination">
      <http:tlsServerParameters secureSocketProtocol="TLSv1">
        ...
        <sec:keyManagers keyPassword="CertPassword">
          <sec:keyStore type="JKS"
                        password="KeystorePassword"
                        file="certs/CertName.jks"/>
        </sec:keyManagers>
        ...
      </http:tlsServerParameters>
    </http:destination>
    주의

    애플리케이션 인증서가 포함된 디렉터리(예: X509Deploy/certs/)는 보안 디렉터리여야 합니다(즉, 관리자가 읽고 쓸 수 있음).

    주의

    구성 파일에는 일반 텍스트로 암호가 포함되어 있으므로 XML 구성 파일이 포함된 디렉터리는 보안 디렉터리(즉, 관리자가 읽고 쓸 수 있음)여야 합니다.

4장. HTTPS Cipher Suites 구성

초록

이 장에서는 HTTPS 연결을 설정하기 위해 클라이언트 및 서버에서 사용할 수 있는 암호화 제품군 목록을 지정하는 방법을 설명합니다. 보안 핸드셰이크 중에 클라이언트는 서버에서 사용할 수 있는 암호화 제품군 중 하나와 일치하는 암호화 제품군을 선택합니다.

4.1. 지원되는 Cipher Suites

4.1.1. 개요

암호화 제품군 은 SSL/TLS 연결 구현 방법을 정확하게 결정하는 보안 알고리즘 컬렉션입니다.

예를 들어 SSL/TLS 프로토콜은 메시지 다이제스트 알고리즘을 사용하여 메시지를 서명하도록 지시합니다. 그러나 다이제스트 알고리즘의 선택은 연결에 사용되는 특정 암호화 제품군에 따라 결정됩니다. 일반적으로 애플리케이션은 MD5 또는 SHA 다이제스트 알고리즘을 선택할 수 있습니다.

Apache CXF의 SSL/TLS 보안에 사용할 수 있는 암호화 제품군은 엔드포인트에 지정된 특정 JSSE 공급자에 따라 다릅니다.

4.1.2. JCE/JSSE 및 보안 공급자

JCE(Java Cryptography Extension) 및 JSSE(Java Secure Socket Extension)는 Java 보안 구현을 보안 공급자 라고 하는 임의의 타사 툴킷으로 교체할 수 있는 플러그형 프레임워크를 구성합니다.

4.1.3. SunJSSE 공급자

실제로 Apache CXF의 보안 기능은 SunJSSE 라는 SUN의 JSSE 공급자에서만 테스트되었습니다.

따라서 SSL/TLS 구현 및 Apache CXF에서 사용 가능한 암호화 제품군 목록은 SUN의 JSSE 공급자에서 사용할 수 있는 내용에 따라 효과적으로 결정됩니다.

4.1.4. SunJSSE에서 지원하는 암호화 제품군

다음 암호화 제품군은 J2SE 1.5.0 Java 개발 키트의 SUN의 JSSE 공급자가 지원합니다 (SUN의 JSSE 참조 가이드의 부록 A 참조 참조 참조).

  • 표준 암호:

    SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA
    SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA
    SSL_DHE_DSS_WITH_DES_CBC_SHA
    SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA
    SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA
    SSL_DHE_RSA_WITH_DES_CBC_SHA
    SSL_RSA_EXPORT_WITH_DES40_CBC_SHA
    SSL_RSA_EXPORT_WITH_RC4_40_MD5
    SSL_RSA_WITH_3DES_EDE_CBC_SHA
    SSL_RSA_WITH_DES_CBC_SHA
    SSL_RSA_WITH_RC4_128_MD5
    SSL_RSA_WITH_RC4_128_SHA
    TLS_DHE_DSS_WITH_AES_128_CBC_SHA
    TLS_DHE_DSS_WITH_AES_256_CBC_SHA
    TLS_DHE_RSA_WITH_AES_128_CBC_SHA
    TLS_DHE_RSA_WITH_AES_256_CBC_SHA
    TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5
    TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA
    TLS_KRB5_EXPORT_WITH_RC4_40_MD5
    TLS_KRB5_EXPORT_WITH_RC4_40_SHA
    TLS_KRB5_WITH_3DES_EDE_CBC_MD5
    TLS_KRB5_WITH_3DES_EDE_CBC_SHA
    TLS_KRB5_WITH_DES_CBC_MD5
    TLS_KRB5_WITH_DES_CBC_SHA
    TLS_KRB5_WITH_RC4_128_MD5
    TLS_KRB5_WITH_RC4_128_SHA
    TLS_RSA_WITH_AES_128_CBC_SHA
    TLS_RSA_WITH_AES_256_CBC_SHA
  • null 암호화, 무결성 전용 암호:

    SSL_RSA_WITH_NULL_MD5
    SSL_RSA_WITH_NULL_SHA
  • 익명 Diffie-Hellman 암호(인증 없음):

    SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA
    SSL_DH_anon_EXPORT_WITH_RC4_40_MD5
    SSL_DH_anon_WITH_3DES_EDE_CBC_SHA
    SSL_DH_anon_WITH_DES_CBC_SHA
    SSL_DH_anon_WITH_RC4_128_MD5
    TLS_DH_anon_WITH_AES_128_CBC_SHA
    TLS_DH_anon_WITH_AES_256_CBC_SHA

4.1.5. JSSE 참조 가이드

SUN의 JSSE 프레임워크에 대한 자세한 내용은 다음 위치에서 JSSE 참조 가이드를 참조하십시오.

http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html

4.2. 암호화 제품군 필터

4.2.1. 개요

일반적인 애플리케이션에서는 일반적으로 사용 가능한 암호화 제품군 목록을 JSSE 공급자가 지원하는 암호의 하위 집합으로 제한하려고 합니다.

일반적으로 sec:cipherSuites 요소 대신 sec:cipherSuitesFilter 요소를 사용하여 사용하려는 암호화 제품군을 선택해야 합니다.

sec:cipherSuites 요소는 의도하지 않은 의미 체계가 있기 때문에 일반적으로 사용하지 않는 것이 좋습니다. 로드된 보안 공급자가 최소한 나열된 암호화 제품군을 지원하도록 요청할 수 있습니다. 그러나 로드된 보안 공급자는 지정된 암호화 제품군보다 더 많은 암호화 제품군을 지원할 수 있습니다. 따라서 sec:cipherSuites 요소를 사용하면 런타임에 어떤 암호화 제품군이 지원되는지 명확하지 않습니다.

4.2.2. 네임스페이스

표 4.1. “Cipher Suite 필터 구성에 사용되는 네임스페이스” 이 섹션에서 참조되는 XML 네임스페이스를 표시합니다.

표 4.1. Cipher Suite 필터 구성에 사용되는 네임스페이스

4.2.3. sec:cipherSuitesFilter 요소

sec:cipherSuitesFilter 요소를 사용하여 암호화 제품군 필터를 정의합니다. 이 요소는 http:tlsClientParameters 요소 또는 httpj:tlsServerParameters 요소의 자식일 수 있습니다. 일반적인 sec:cipherSuitesFilter 요소에는 예 4.1. “sec:cipherSuitesFilter Element의 구조” 에 표시된 개요 구조가 있습니다.

예 4.1. sec:cipherSuitesFilter Element의 구조

<sec:cipherSuitesFilter>
    <sec:include>RegularExpression</sec:include>
    <sec:include>RegularExpression</sec:include>
    ...
    <sec:exclude>RegularExpression</sec:exclude>
    <sec:exclude>RegularExpression</sec:exclude>
    ...
</sec:cipherSuitesFilter>

4.2.4. 의미 체계

sec:cipherSuitesFilter 요소에 다음 의미 규칙이 적용됩니다.

  1. sec:cipherSuitesFilter 요소가 끝점 구성에 표시되지 않는 경우(즉, 관련 http:conduit 또는 httpj:engine-factory 요소에 없는) 다음 기본 필터가 사용됩니다.

    <sec:cipherSuitesFilter>
        <sec:include>.*_EXPORT_.*</sec:include>
        <sec:include>.*_EXPORT1024.*</sec:include>
        <sec:include>.*_DES_.*</sec:include>
        <sec:include>.*_WITH_NULL_.*</sec:include>
    </sec:cipherSuitesFilter>
  2. sec:cipherSuitesFilter 요소가 끝점 구성에 표시되면 기본적으로 모든 암호화 제품군이 제외됩니다.
  3. 암호화 제품군을 포함하려면 sec:include 하위 요소를 sec:cipherSuitesFilter 요소에 추가합니다. sec:include 요소의 내용은 하나 이상의 암호화 제품군 이름과 일치하는 정규식입니다(예: “SunJSSE에서 지원하는 암호화 제품군”의 암호화 제품군 이름 참조).
  4. 선택한 암호화 제품군 세트를 추가로 구체화하려면 sec:exclude 요소를 sec:cipherSuitesFilter 요소에 추가할 수 있습니다. sec:exclude 요소의 내용은 현재 포함된 세트의 0개 이상의 암호화 제품군 이름과 일치하는 정규식입니다.

    참고

    경우에 따라 바람직하지 않은 암호화 제품군을 실수로 포함하지 않도록 현재 포함되지 않은 암호화 제품군을 명시적으로 제외하는 것이 좋습니다.

4.2.5. 일치하는 정규식

sec:includesec:exclude 요소에 표시되는 정규식에 대한 grammar는 Java 정규식 유틸리티인 java.util.regex.Pattern.에 의해 정의됩니다. 문법에 대한 자세한 설명은 Java 참조 가이드 http://download.oracle.com/javase/1.5.0/docs/api/java/util/regex/Pattern.html 를 참조하십시오.

4.2.6. 고객 접착제 예

다음 XML 구성은 암호화 제품군 필터를 원격 엔드포인트 {WSDLPortNamespace}PortName 에 적용하는 클라이언트의 예를 보여줍니다. 클라이언트가 이 엔드포인트에 대한 SSL/TLS 연결을 열려고 시도할 때마다 사용 가능한 암호화 제품군은 sec:cipherSuitesFilter 요소에서 선택한 세트로 제한합니다.

<beans ... >
  <http:conduit name="{WSDLPortNamespace}PortName.http-conduit">
    <http:tlsClientParameters>
      ...
      <sec:cipherSuitesFilter>
        <sec:include>.*_WITH_3DES_.*</sec:include>
        <sec:include>.*_WITH_DES_.*</sec:include>
        <sec:exclude>.*_WITH_NULL_.*</sec:exclude>
        <sec:exclude>.*_DH_anon_.*</sec:exclude>
      </sec:cipherSuitesFilter>
    </http:tlsClientParameters>
  </http:conduit>

  <bean id="cxf" class="org.apache.cxf.bus.CXFBusImpl"/>
</beans>

4.3. SSL/TLS 프로토콜 버전

4.3.1. 개요

Apache CXF에서 지원하는 SSL/TLS 프로토콜 버전은 구성된 특정 JSSE 공급자에 따라 다릅니다. 기본적으로 JSSE 공급자는 SUN의 JSSE 공급자 구현으로 구성됩니다.

주의

SSL/TLS 보안을 활성화하는 경우 Poodle 취약점(CVE-2014-3566) 으로부터 보호하기 위해 SSLv3 프로토콜을 명시적으로 비활성화해야 합니다. 자세한 내용은 JBoss Fuse 6.x 및 JBoss A-MQ 6.x에서 SSLv3 비활성화 를 참조하십시오.

4.3.2. SunJSSE에서 지원하는 SSL/TLS 프로토콜 버전

표 4.2. “SUN의 JSSE 공급자가 지원하는 SSL/TLS 프로토콜” SUN의 JSSE 공급자가 지원하는 SSL/TLS 프로토콜 버전을 보여줍니다.

표 4.2. SUN의 JSSE 공급자가 지원하는 SSL/TLS 프로토콜

프로토콜설명

SSLv2Hello

사용하지 마십시오! (POODLE 보안 취약점)

SSLv3

사용하지 마십시오! (POODLE 보안 취약점)

TLSv1

TLS 버전 1 지원

TLSv1.1

TLS 버전 1.1 지원 (JDK 7 이상)

TLSv1.2

TLS 버전 1.2 지원 (JDK 7 이상)

4.3.3. 특정 SSL/TLS 프로토콜 버전 제외

기본적으로 JSSE 공급자가 제공하는 모든 SSL/TLS 프로토콜은 CXF 엔드포인트에서 사용할 수 있습니다( SSLv2HelloSSLv3 프로토콜 제외). 이 프로토콜은 Poodle 취약점 (CVE-2014-3566)이후 Fuse 버전 6.2.0 이후 CXF 런타임에서 특별히 제외되었습니다.

특정 SSL/TLS 프로토콜을 제외하려면 엔드포인트 구성에서 sec:excludeProtocols 요소를 사용합니다. sec:excludeProtocols 요소를 httpj:tlsServerParameters 요소(서버 측)의 하위로 구성할 수 있습니다.

TLS 버전 1.2를 제외한 모든 프로토콜을 제외하려면 sec:excludeProtocols 요소를 다음과 같이 구성합니다 ( JDK 7 이상을 사용한다고 가정).

<?xml version="1.0" encoding="UTF-8"?>
<beans ... >
  ...
  <httpj:engine-factory bus="cxf">
    <httpj:engine port="9001">
      ...
      <httpj:tlsServerParameters>
        ...
        <sec:excludeProtocols>
          <sec:excludeProtocol>SSLv2Hello</sec:excludeProtocol>
          <sec:excludeProtocol>SSLv3</sec:excludeProtocol>
          <sec:excludeProtocol>TLSv1</sec:excludeProtocol>
          <sec:excludeProtocol>TLSv1.1</sec:excludeProtocol>
        </sec:excludeProtocols>
      </httpj:tlsServerParameters>
    </httpj:engine>
  </httpj:engine-factory>
  ...
</beans>
중요

Poodle 취약점 (CVE-2014-3566) 으로부터 보호하기 위해 항상 SSLv2HelloSSLv3 프로토콜을 제외하는 것이 좋습니다.

4.3.4. SecureSocketProtocol 특성

http:tlsClientParameters 요소와 httpj:tlsServerParameters 요소 모두 secureSocketProtocol 속성을 지원하므로 특정 프로토콜을 지정할 수 있습니다.

이 속성의 의미 체계는 혼동하지만, 이 속성은 CXF가 지정된 프로토콜을 지원하는 SSL 공급자를 선택하도록 강제 하지만 지정된 프로토콜만 사용하도록 공급자는 제한하지 않습니다. 따라서 끝점은 지정된 프로토콜과 다른 프로토콜을 사용할 수 있습니다. 이러한 이유로 코드에서 secureSocketProtocol 속성을 사용하지 않는 것이 좋습니다.

5장. WS-Policy Framework

초록

이 장에서는 WS-Policy 프레임워크의 기본 개념, 정책 제목 및 정책 어설션 정의, 정책 어설션을 결합하여 정책 표현식을 만드는 방법을 설명합니다.

5.1. WS-Policy 소개

5.1.1. 개요

WS-Policy 사양 은 웹 서비스 애플리케이션에서 런타임 시 연결 및 통신의 의미 체계를 수정하는 정책을 적용하기 위한 일반적인 프레임워크를 제공합니다. Apache CXF 보안은 WS-Policy 프레임워크를 사용하여 메시지 보호 및 인증 요구 사항을 구성합니다.

5.1.2. 정책 및 정책 참조

정책을 지정하는 가장 간단한 방법은 정책을 적용하려는 위치에 직접 포함하는 것입니다. 예를 들어 WSDL 계약의 특정 포트와 정책을 연결하려면 다음과 같이 지정할 수 있습니다.

<wsdl:definitions targetNamespace="http://tempuri.org/"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" ... >
  ...
  <wsdl:service name="PingService10">
    <wsdl:port name="UserNameOverTransport_IPingService" binding="BindingName">
      <wsp:Policy> <!-- Policy expression comes here! --> </wsp:Policy>
      <soap:address location="SOAPAddress"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

정책을 지정하는 다른 방법은 정책을 적용하려는 시점에 정책 참조 요소 wsp:PolicyReference 를 삽입한 다음 XML 파일의 다른 시점에 정책 요소 wsp:Policy 를 삽입하는 것입니다. 예를 들어 정책 참조를 사용하여 정책을 특정 포트와 연결하려면 다음과 같은 구성을 사용할 수 있습니다.

<wsdl:definitions targetNamespace="http://tempuri.org/"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" ... >
  ...
  <wsdl:service name="PingService10">
    <wsdl:port name="UserNameOverTransport_IPingService" binding="BindingName">
      <wsp:PolicyReference URI="#PolicyID"/>
      <soap:address location="SOAPAddress"/>
    </wsdl:port>
  </wsdl:service>
  ...
  <wsp:Policy wsu:Id="PolicyID">
    <!-- Policy expression comes here ... -->
  </wsp:Policy>
</wsdl:definitions>

정책 참조인 wsp:PolicyReference 가 ID, PolicyID 를 사용하여 참조된 정책을 찾습니다( URI 특성에 # 접두사 문자가 추가됨). 정책 자체인 wsp:Policy 는 속성 wsu:Id="PolicyID" 를 추가하여 식별해야 합니다.

5.1.3. 정책 주체

정책이 연결된 엔터티를 정책 주체 라고 합니다. 예를 들어 정책을 끝점과 연결할 수 있으며, 이 경우 끝점 은 정책 제목입니다. 지정된 정책 제목과 여러 정책을 연결할 수 있습니다. WS-Policy 프레임워크는 다음과 같은 종류의 정책 주체를 지원합니다.

5.1.4. 서비스 정책 제목

정책을 서비스와 연결하려면 < wsp:Policy > 요소 또는 < wsp:PolicyReference > 요소를 다음 WSDL 1.1 요소의 하위 요소로 삽입합니다.

  • WSDL:service-이 서비스에서 제공하는 모든 포트(endpoints)에 정책을 적용합니다.

5.1.5. 끝점 정책 제목

정책을 끝점과 연결하려면 < wsp:Policy > 요소 또는 < wsp:PolicyReference > 요소를 다음 WSDL 1.1 요소의 하위 요소로 삽입합니다.

  • WSDL:portType-이 포트 유형을 사용하는 모든 포트(endpoints)에 정책을 적용합니다.
  • WSDL:binding-이 바인딩을 사용하는 모든 포트에 정책을 적용합니다.
  • WSDL:port-이 끝점에만 정책을 적용합니다.

예를 들어 정책 참조를 사용하여 정책을 끝점 바인딩과 연결할 수 있습니다.

<wsdl:definitions targetNamespace="http://tempuri.org/"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" ... >
  ...
  <wsdl:binding name="EndpointBinding" type="i0:IPingService">
    <wsp:PolicyReference URI="#PolicyID"/>
    ...
  </wsdl:binding>
  ...
  <wsp:Policy wsu:Id="PolicyID"> ... </wsp:Policy>
  ...
</wsdl:definitions>

5.1.6. 운영 정책 제목

정책을 작업과 연결하려면 < wsp:Policy > 요소 또는 < wsp:PolicyReference > 요소를 다음 WSDL 1.1 요소의 하위 요소로 삽입합니다.

  • wsdl:portType/wsdl:operation
  • wsdl:binding/wsdl:operation

예를 들어 정책 참조를 사용하여 다음과 같이 바인딩의 작업과 정책을 연결할 수 있습니다.

<wsdl:definitions targetNamespace="http://tempuri.org/"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" ... >
  ...
  <wsdl:binding name="EndpointBinding" type="i0:IPingService">
    <wsdl:operation name="Ping">
      <wsp:PolicyReference URI="#PolicyID"/>
      <soap:operation soapAction="http://xmlsoap.org/Ping" style="document"/>
      <wsdl:input name="PingRequest"> ... </wsdl:input>
      <wsdl:output name="PingResponse"> ... </wsdl:output>
    </wsdl:operation>
    ...
  </wsdl:binding>
  ...
  <wsp:Policy wsu:Id="PolicyID"> ... </wsp:Policy>
  ...
</wsdl:definitions>

5.1.7. 메시지 정책 제목

정책을 메시지와 연결하려면 < wsp:Policy > 요소 또는 < wsp:PolicyReference > 요소를 다음 WSDL 1.1 요소의 하위 요소로 삽입합니다.

  • wsdl:message
  • wsdl:portType/wsdl:operation/wsdl:input
  • wsdl:portType/wsdl:operation/wsdl:output
  • wsdl:portType/wsdl:operation/wsdl:fault
  • wsdl:binding/wsdl:operation/wsdl:input
  • wsdl:binding/wsdl:operation/wsdl:output
  • wsdl:binding/wsdl:operation/wsdl:fault

예를 들어 정책 참조를 사용하여 다음과 같이 바인딩의 메시지와 정책을 연결할 수 있습니다.

<wsdl:definitions targetNamespace="http://tempuri.org/"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" ... >
  ...
  <wsdl:binding name="EndpointBinding" type="i0:IPingService">
    <wsdl:operation name="Ping">
      <soap:operation soapAction="http://xmlsoap.org/Ping" style="document"/>
      <wsdl:input name="PingRequest">
        <wsp:PolicyReference URI="#PolicyID"/>
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="PingResponse"> ... </wsdl:output>
    </wsdl:operation>
    ...
  </wsdl:binding>
  ...
  <wsp:Policy wsu:Id="PolicyID"> ... </wsp:Policy>
  ...
</wsdl:definitions>

5.2. 정책 표현식

5.2.1. 개요

일반적으로 wsp:Policy 요소는 여러 다른 정책 설정으로 구성됩니다. 개별 정책 설정은 정책 어설션으로 지정됩니다. 따라서 wsp:Policy 요소에 의해 정의된 정책은 실제로 복합 오브젝트입니다. wsp:Policy 요소의 내용은 정책 표현식 이라고 하며, 여기서 정책 표현식은 기본 정책 어설션의 다양한 논리적 조합으로 구성됩니다. 정책 표현식의 구문을 조정하면 전체적으로 정책을 충족하기 위해 런타임 시 충족해야 하는 정책 어설션의 조합을 결정할 수 있습니다.

이 섹션에서는 정책 표현식의 구문 및 의미 체계에 대해 자세히 설명합니다.

5.2.2. 정책 어설션

정책 주장은 정책을 생성하기 위해 다양한 방법으로 결합할 수 있는 기본 빌딩 블록입니다. 정책 어설션에는 두 가지 주요 특성이 있습니다. 즉, 정책 제목에 기본 기능 단위를 추가하고 런타임 시 평가할 부울 어설션을 나타냅니다. 예를 들어 WS-Security 사용자 이름 토큰이 요청 메시지와 함께 전파되어야 하는 다음 정책 어설션을 고려하십시오.

<sp:SupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
  <wsp:Policy>
    <sp:UsernameToken/>
  </wsp:Policy>
</sp:SupportingTokens>

엔드 포인트 정책 주체와 관련된 경우 이 정책 어설션은 다음과 같은 영향을 미칩니다.

  • 웹 서비스 엔드포인트는 UsernameToken 자격 증명을 마샬링/마이클합니다.
  • 런타임에 정책 어설션은 true 를 반환합니다. UsernameToken 자격 증명이 클라이언트 측에 제공되거나 들어오는 메시지(서버의 경우)에서 수신되는 경우 정책 어설션이 false 를 반환합니다.

정책 어설션에서 false 를 반환하는 경우 오류가 반드시 발생하지는 않습니다. 특정 정책 주장의 순 영향은 정책에 어떻게 삽입되는지와 다른 정책 주장과 어떻게 결합되는지에 따라 달라집니다.

5.2.3. 정책 대안

정책 어설션은 wsp:Optional 특성과 wsp:Allwsp:ExactlyOne 요소의 다양한 중첩된 조합을 사용하여 추가로 인증할 수 있는 정책 어설션을 사용하여 구축됩니다. 이러한 요소 구성의 순 영향은 허용 가능한 정책 대안 의 범위를 생성하는 것입니다. 이러한 허용 가능한 정책 대안 중 하나가 충족되는 한 전체 정책도 충족됩니다( true로 평가됨).

5.2.4. WSP: 모든 요소

정책 어설션 목록이 wsp:All 요소로 래핑되면 목록의 모든 정책 어설션이 true 로 평가되어야 합니다. 예를 들어 인증 및 권한 부여 정책 어설션의 다음과 같은 조합을 고려하십시오.

<wsp:Policy wsu:Id="AuthenticateAndAuthorizeWSSUsernameTokenPolicy">
  <wsp:All>
    <sp:SupportingTokens>
      <wsp:Policy>
        <sp:UsernameToken/>
      </wsp:Policy>
    </sp:SupportingTokens>
    <sp:SupportingTokens>
      <wsp:Policy>
        <sp:SamlToken/>
      </wsp:Policy>
    </sp:SupportingTokens>
  </wsp:All>
</wsp:Policy>

다음 조건이 모두 적용되는 경우 이전 정책은 특정 들어오는 요청에 대해 충족됩니다.

  • WS-Security UsernameToken 인증 정보가 있어야 하며
  • SAML 토큰이 있어야 합니다.
참고

wsp:Policy 요소는 wsp:All 과 의미적으로 동일합니다. 따라서 이전 예제에서 wsp:All 요소를 제거한 경우 의미 체계적으로 동일한 예제를 얻을 수 있습니다.

5.2.5. WSP:ExactlyOne 요소

정책 어설션 목록이 wsp:ExactlyOne 요소로 래핑되면 목록에 있는 정책 어설션 중 하나 이상이 true 로 평가되어야 합니다. 런타임은 실제 를 반환하는 정책 어설션을 찾을 때까지 정책 어설션을 평가하는 목록을 진행합니다. 이 시점에서 wsp:ExactlyOne 표현식이 충족되고( true를 반환) 목록의 나머지 정책 어설션은 평가되지 않습니다. 예를 들어 인증 정책 어설션의 다음과 같은 조합을 고려하십시오.

<wsp:Policy wsu:Id="AuthenticateUsernamePasswordPolicy">
  <wsp:ExactlyOne>
    <sp:SupportingTokens>
      <wsp:Policy>
        <sp:UsernameToken/>
      </wsp:Policy>
    </sp:SupportingTokens>
    <sp:SupportingTokens>
      <wsp:Policy>
        <sp:SamlToken/>
      </wsp:Policy>
    </sp:SupportingTokens>
  </wsp:ExactlyOne>
</wsp:Policy>

다음 조건 하나에 해당하는 경우 이전 정책은 특정 들어오는 요청에 대해 충족됩니다.

  • WS-Security UsernameToken 인증 정보가 있습니다.
  • SAML 토큰이 있습니다.

특히 두 인증 정보 유형이 모두 존재하는 경우 어설션 중 하나를 평가한 후 정책이 충족되지만 정책 주장 중 어떤 것이 실제로 평가되는지에 대한 보장은 제공되지 않습니다.

5.2.6. 빈 정책

특별한 경우는 빈 정책 이며 그 예는 예 5.1. “빈 정책” 에 표시되어 있습니다.

예 5.1. 빈 정책

<wsp:Policy ... >
   <wsp:ExactlyOne>
      <wsp:All/>
   </wsp:ExactlyOne>
</wsp:Policy>

비어 있는 정책 대안인 < wsp:All/ >는 정책 어설션을 충족할 필요가 없는 대안을 나타냅니다. 즉, 항상 true 를 반환합니다. & lt;wsp:All/ >를 대안으로 사용할 수 있는 경우 정책 주장이 true 가 없는 경우에도 전체 정책을 만족시킬 수 있습니다.

5.2.7. null 정책

특수한 경우는 null 정책 이며 그 예는 예 5.2. “Null 정책” 에 표시되어 있습니다.

예 5.2. Null 정책

<wsp:Policy ... >
   <wsp:ExactlyOne/>
</wsp:Policy>

null 정책 대체인 &lt ;wsp:ExactlyOne/ > 가 충족되지 않는 대안을 나타냅니다. 즉, 항상 false 를 반환합니다.

5.2.8. 일반 양식

실제로 < wsp:All > 및 < wsp:ExactlyOne > 요소를 중첩하면 정책 대안이 작동하기 어려울 수 있는 상당히 복잡한 정책 표현식을 생성할 수 있습니다. 정책 표현식을 쉽게 비교할 수 있도록 WS-Policy 사양은 정책 표현식에 대한 표준 또는 일반 형식을 정의하므로 정책 대안 목록을 모호하게 읽을 수 있습니다. 유효한 모든 정책 표현식을 일반 형식으로 줄일 수 있습니다.

일반적으로 일반 양식 정책 표현식은 예 5.3. “일반 양식 구문” 에 표시된 구문을 준수합니다.

예 5.3. 일반 양식 구문

<wsp:Policy ... >
   <wsp:ExactlyOne>
        <wsp:All> <Assertion .../> ... <Assertion .../> </wsp:All>
        <wsp:All> <Assertion .../> ... <Assertion .../> </wsp:All>
        ...
   </wsp:ExactlyOne>
</wsp:Policy>

각 양식의 < wsp:All>…​</wsp:All > 에서는 유효한 정책 대안을 나타냅니다. 이러한 정책 대안 중 하나가 충족되면 전체적으로 정책이 충족됩니다.

6장. 메시지 보호

초록

이 장에서는 다음의 메시지 보호 메커니즘이 설명되어 있습니다: 도청(암호화 알고리즘 사용) 및 메시지 변조(메시지 다이제스트 알고리즘 사용)로부터 보호 보호는 다양한 수준의 세분성 및 다른 프로토콜 계층에 적용될 수 있습니다. 전송 계층에서는 메시지의 전체 콘텐츠에 보호를 적용할 수 있는 옵션이 있지만, Cryostat 계층에서 메시지의 다양한 부분(보조, 헤더 또는 첨부 파일)에 대한 보호를 적용할 수 있습니다.

6.1. 전송 계층 메시지 보호

6.1.1. 개요

전송 계층 메시지 보호는 전송 계층에서 제공하는 메시지 보호(암호화 및 서명)를 나타냅니다. 예를 들어 HTTPS는 SSL/TLS를 사용하여 암호화 및 메시지 서명 기능을 제공합니다. 실제로 WS-SecurityPolicy는 HTTPS 기능 세트에 많은 추가 기능을 추가하지 않습니다. HTTPS는 블루프린트 XML 구성을 사용하여 이미 완전히 구성할 수 있기 때문입니다( 3장. HTTPS 구성참조). 그러나 HTTPS에 대한 전송 바인딩 정책을 지정하면 WSDL 계약에 보안 요구 사항을 포함할 수 있다는 이점이 있습니다. 따라서 WSDL 계약의 사본을 가져오는 모든 클라이언트는 WSDL 계약의 엔드포인트에 대한 전송 계층 보안 요구 사항이 무엇인지 검색할 수 있습니다.

주의

전송 계층에서 SSL/TLS 보안을 활성화하는 경우 Poodle 취약점 (CVE-2014-3566) 으로부터 보호하기 위해 SSLv3 프로토콜을 명시적으로 비활성화해야 합니다. 자세한 내용은 JBoss Fuse 6.x 및 JBoss A-MQ 6.x에서 SSLv3 비활성화 를 참조하십시오.

6.1.2. 사전 요구 사항

WS-SecurityPolicy를 사용하여 HTTPS 전송을 구성하는 경우 블루프린트 구성에서 HTTPS 보안을 적절하게 구성해야 합니다.

예 6.1. “블루프린트의 클라이언트 HTTPS 구성” HTTPS 전송 프로토콜을 사용하도록 클라이언트를 구성하는 방법을 보여줍니다. sec:keyManagers 요소는 클라이언트의 고유 인증서, alice.pfxsec:trustManagers 요소는 신뢰할 수 있는 CA 목록을 지정합니다. http:conduit 요소의 name 속성은 엔드포인트 주소와 일치하도록 와일드카드를 사용하는 방법을 참조하십시오. 클라이언트 측에서 HTTPS를 구성하는 방법에 대한 자세한 내용은 3장. HTTPS 구성 을 참조하십시오.

예 6.1. 블루프린트의 클라이언트 HTTPS 구성

<beans xmlns="https://osgi.org/xmlns/blueprint/v1.0.0/"
       xmlns:http="http://cxf.apache.org/transports/http/configuration"
       xmlns:sec="http://cxf.apache.org/configuration/security" ... >

  <http:conduit name="https://.*/UserNameOverTransport.*">
    <http:tlsClientParameters disableCNCheck="true">
      <sec:keyManagers keyPassword="password">
        <sec:keyStore type="pkcs12" password="password" resource="certs/alice.pfx"/>
      </sec:keyManagers>
      <sec:trustManagers>
        <sec:keyStore type="pkcs12" password="password" resource="certs/bob.pfx"/>
      </sec:trustManagers>
    </http:tlsClientParameters>
  </http:conduit>
  ...
</beans>

예 6.2. “블루프린트의 서버 HTTPS 구성” HTTPS 전송 프로토콜을 사용하도록 서버를 구성하는 방법을 보여줍니다. sec:keyManagers 요소는 서버의 고유 인증서인 bob.pfx 를 지정하고 sec:trustManagers 요소는 신뢰할 수 있는 CA 목록을 지정합니다. 서버 측에서 HTTPS를 구성하는 방법에 대한 자세한 내용은 3장. HTTPS 구성 을 참조하십시오.

예 6.2. 블루프린트의 서버 HTTPS 구성

<beans xmlns="https://osgi.org/xmlns/blueprint/v1.0.0/"
       xmlns:httpj="http://cxf.apache.org/transports/http-jetty/configuration"
       xmlns:sec="http://cxf.apache.org/configuration/security" ... >

  <httpj:engine-factory id="tls-settings">
    <httpj:engine port="9001">
      <httpj:tlsServerParameters secureSocketProtocol="TLSv1">
        <sec:keyManagers keyPassword="password">
          <sec:keyStore type="pkcs12" password="password" resource="certs/bob.pfx"/>
        </sec:keyManagers>
        <sec:trustManagers>
          <sec:keyStore type="pkcs12" password="password" resource="certs/alice.pfx"/>
        </sec:trustManagers>
      </httpj:tlsServerParameters>
    </httpj:engine>
  </httpj:engine-factory>
  ...
</beans>

6.1.3. 정책 제목

전송 바인딩 정책은 끝점 정책 제목에 적용해야 합니다( “끝점 정책 제목”참조). 예를 들어 ID가 있는 전송 바인딩 정책이 UserNameOverTransport_IPingService_policy 인 경우 다음과 같이 정책을 끝점 바인딩에 적용할 수 있습니다.

<wsdl:binding name="UserNameOverTransport_IPingService" type="i0:IPingService">
  <wsp:PolicyReference URI="#UserNameOverTransport_IPingService_policy"/>
  ...
</wsdl:binding>

6.1.4. 구문

TransportBinding 요소에는 다음과 같은 구문이 있습니다.

<sp:TransportBinding xmlns:sp="..." ... >
  <wsp:Policy xmlns:wsp="...">
    <sp:TransportToken ... >
      <wsp:Policy> ... </wsp:Policy>
      ...
    </sp:TransportToken>
    <sp:AlgorithmSuite ... > ... </sp:AlgorithmSuite>
    <sp:Layout ... > ... </sp:Layout> ?
    <sp:IncludeTimestamp ... /> ?
      ...
  </wsp:Policy>
  ...
</sp:TransportBinding>

6.1.5. 정책 샘플

예 6.3. “전송 바인딩의 예” HTTPS 전송( sp:HttpsToken 요소에 의해 지정됨) 및 256비트 알고리즘 모음( sp:Basic256 요소에서 지정)을 사용하여 기밀성 및 무결성을 필요로 하는 전송 바인딩의 예를 보여줍니다.

예 6.3. 전송 바인딩의 예

<wsp:Policy wsu:Id="UserNameOverTransport_IPingService_policy">
  <wsp:ExactlyOne>
    <wsp:All>
      <sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
        <wsp:Policy>
          <sp:TransportToken>
            <wsp:Policy>
              <sp:HttpsToken RequireClientCertificate="false"/>
            </wsp:Policy>
          </sp:TransportToken>
          <sp:AlgorithmSuite>
            <wsp:Policy>
              <sp:Basic256/>
            </wsp:Policy>
          </sp:AlgorithmSuite>
          <sp:Layout>
            <wsp:Policy>
              <sp:Lax/>
            </wsp:Policy>
          </sp:Layout>
          <sp:IncludeTimestamp/>
        </wsp:Policy>
      </sp:TransportBinding>
      ...
      <sp:Wss10 xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
        <wsp:Policy>
          <sp:MustSupportRefKeyIdentifier/>
          <sp:MustSupportRefIssuerSerial/>
        </wsp:Policy>
      </sp:Wss10>
    </wsp:All>
  </wsp:ExactlyOne>
</wsp:Policy>

6.1.6. sp:TransportToken

이 요소에는 두 가지 효과가 있습니다. 특정 유형의 보안 토큰이 필요하며 전송의 보안 방법을 나타냅니다. 예를 들어 sp:HttpsToken 을 지정하면 연결이 HTTPS 프로토콜에 의해 보호되고 보안 토큰이 X.509 인증서임을 나타냅니다.

6.1.7. sp:AlgorithmSuite

이 요소는 서명 및 암호화에 사용할 암호화 알고리즘 제품군을 지정합니다. 사용 가능한 알고리즘 모음에 대한 자세한 내용은 6.2.7절. “알고리즘 모음 지정” 을 참조하십시오.

6.1.8. sp:Layout

이 요소는 보안 헤더가 Cryostat 메시지에 추가되는 순서에 조건을 적용할지 여부를 지정합니다. sp:Lax 요소는 보안 헤더 순서에 조건이 적용되지 않도록 지정합니다. sp:Lax 의 대안은 sp: Ssimplet ,sp:LaxTimestampFirst 또는 sp:LaxTimestampLast 입니다.

6.1.9. sp:IncludeTimestamp

이 요소가 정책에 포함된 경우 런타임은 wsu:Timestamp 요소를 wsse:Security 헤더에 추가합니다. 기본적으로 타임스탬프는 포함되지 않습니다.

6.1.10. sp:MustSupportRefKeyIdentifier

이 요소는 WS-Security 1.0 사양에 지정된 대로 보안 런타임에서 키 식별자 토큰 참조를 처리할 수 있어야 함을 지정합니다. 키 식별자는 서명 또는 암호화 요소 내에서 사용될 수 있는 키 토큰을 식별하는 메커니즘입니다. Apache CXF에는 이 기능이 필요합니다.

6.1.11. sp:MustSupportRefIssuerSerial

이 요소는 WS-Security 1.0 사양에 지정된 대로 보안 런타임에서 발급자 및 직렬 번호 토큰 참조를 처리할 수 있어야 함을 지정합니다. 발행자 및 일련 번호는 서명 또는 암호화 요소 내에서 사용할 수 있는 키 토큰을 식별하는 메커니즘입니다. Apache CXF에는 이 기능이 필요합니다.

6.2. Cryostat 메시지 보호

6.2.1. Cryostat 메시지 보호 소개

6.2.1.1. 개요

전송 계층 대신 Cryostat 인코딩 계층에서 메시지 보호를 적용하면 보다 유연한 보호 정책에 액세스할 수 있습니다. 특히 Cryostat 계층은 메시지 구조를 인식하기 때문에 실제로 보호가 필요한 헤더를 암호화하고 서명하여 세분화된 수준에서 보호를 적용할 수 있습니다. 이 기능을 사용하면 보다 정교한 다중 계층 아키텍처를 지원할 수 있습니다. 예를 들어 하나의 일반 텍스트 헤더는 중간 계층(보안 인트라넷 내에 위치)을 대상으로 할 수 있지만 암호화된 헤더는 최종 대상(비보안 공용 네트워크를 통해 연결됨)을 대상으로 할 수 있습니다.

6.2.1.2. 보안 바인딩

WS-SecurityPolicy 사양에 설명된 대로 다음 바인딩 유형 중 하나를 사용하여 Cryostat 메시지를 보호할 수 있습니다.

  • SP:TransportBinding- 전송 바인딩 은 전송 수준에서 제공되는 메시지 보호(예: HTTPS를 통해)를 나타냅니다. 이 바인딩은 ESP뿐만 아니라 모든 메시지 유형을 보호하는 데 사용할 수 있으며 이전 섹션인 6.1절. “전송 계층 메시지 보호” 에 자세히 설명되어 있습니다.
  • SP :AsymmetricBinding-AsymmetricBinding은 asymmetric 암호화(공개 키 암호화라고도 함)를 사용하여 보호 기능이 구현되는 Cryostat 메시지 인코딩 계층에서 제공되는 메시지 보호를 나타냅니다.
  • SP:SymmetricBinding- 대칭 바인딩 은 대칭 암호화를 사용하여 보호 기능이 구현되는 Cryostat 메시지 인코딩 계층에서 제공되는 메시지 보호를 나타냅니다. 대칭 암호화의 예는 WS-SecureConversation 및 Kerberos 토큰에서 제공하는 토큰입니다.

6.2.1.3. 메시지 보호

다음과 같은 보호 특성을 메시지의 일부 또는 전체에 적용할 수 있습니다.

  • 암호화.
  • 서명.
  • signing+암호화(암호화 전에 서명).
  • 암호화+ 서명(서 서명하기 전에 암호화).

이러한 보호 특성은 단일 메시지에서 임의로 결합될 수 있습니다. 따라서 메시지의 일부만 암호화할 수 있지만 메시지의 다른 부분은 서명만 되고 메시지의 다른 부분은 서명하고 암호화할 수 있습니다. 또한 메시지의 일부를 보호되지 않은 상태로 둘 수도 있습니다.

메시지 보호를 적용하기 위한 가장 유연한 옵션은 Cryostat 계층(sp:AsymmetricBinding 또는 sp:SymmetricBinding)에서 사용할 수 있습니다. 전송 계층(sp:TransportBinding)은 전체 메시지에 대한 보호를 적용하는 옵션만 제공합니다.

6.2.1.4. 보호할 메시지의 일부를 지정

현재 Apache CXF를 사용하면 ESP 메시지의 다음 부분에 서명하거나 암호화할 수 있습니다.

  • body-point 메시지에서 soap:BODY 요소 전체에 서명 및/또는 암호화합니다.
  • header(s)-sign 및/또는 하나 이상의 Cryostat 메시지 헤더를 암호화합니다. 각 헤더에 대한 보호 품질을 개별적으로 지정할 수 있습니다.
  • 첨부 파일- Loki 메시지의 모든 첨부 파일을 서명 및/또는 암호화합니다.
  • elements-chunk 메시지의 특정 XML 요소를 서명 및/또는 암호화합니다.

6.2.1.5. 구성의 역할

메시지 보호에 필요한 모든 세부 정보가 정책을 사용하여 지정되는 것은 아닙니다. 정책은 주로 서비스에 필요한 보호의 품질을 지정하는 방법을 제공하기 위한 것입니다. 보안 토큰, 암호 등과 같은 지원 세부 정보는 별도의 제품별 메커니즘을 사용하여 제공해야 합니다. 실제로 Apache CXF에서는 블루프린트 XML 구성 파일에 일부 지원 구성 세부 정보를 제공해야 합니다. 자세한 내용은 6.2.6절. “암호화 키 및 서명 키 제공”의 내용을 참조하십시오.

6.2.2. 기본 서명 및 암호화 시나리오

6.2.2.1. 개요

여기에 설명된 시나리오는 클라이언트-서버 애플리케이션입니다. 이 애플리케이션에서는 비대칭 바인딩 정책이 클라이언트와 서버 간에 전달되는 메시지의#159 본문을 암호화하고 서명하도록 설정되어 있습니다.

6.2.2.2. 시나리오 예

그림 6.1. “기본 서명 및 암호화 시나리오” 비대칭 바인딩 정책을 WSDL 계약의 끝점과 연결하여 지정하는 기본 서명 및 암호화 시나리오에 대한 개요를 보여줍니다.

그림 6.1. 기본 서명 및 암호화 시나리오

메시지 보호 01

6.2.2.3. 시나리오 단계

그림 6.1. “기본 서명 및 암호화 시나리오” 의 클라이언트가 수신자의 끝점에서 동기 작업을 호출하면 요청 및 응답 메시지가 다음과 같이 처리됩니다.

  1. 발신 요청 메시지가 WS-SecurityPolicy 핸들러를 통과할 때 처리기는 클라이언트의 비대칭 바인딩 정책에 지정된 정책에 따라 메시지를 처리합니다. 이 예에서 처리기는 다음 처리를 수행합니다.

    1. Cryostat 공개 키를 사용하여 메시지의 Cryostat 본문을 암호화합니다.
    2. Alice의 개인 키를 사용하여 암호화된 Cryostat 본문에 서명합니다.
  2. 들어오는 요청 메시지가 서버의 WS-SecurityPolicy 처리기를 통과할 때 처리기는 서버의 비대칭 바인딩 정책에 지정된 정책에 따라 메시지를 처리합니다. 이 예에서 처리기는 다음 처리를 수행합니다.

    1. Alice의 공개 키를 사용하여 서명을 확인합니다.
    2. Cryostat의 개인 키를 사용하여 Cryostat 본문의 암호를 해독합니다.
  3. 발신 응답 메시지가 서버의 WS-SecurityPolicy 처리기를 통해 다시 전달될 때 처리기는 다음 처리를 수행합니다.

    1. Alice의 공개 키를 사용하여 메시지의 Cryostat 본문을 암호화합니다.
    2. Cryostat의 개인 키를 사용하여 암호화된 Cryostat 본문에 서명합니다.
  4. 들어오는 응답 메시지가 클라이언트의 WS-SecurityPolicy 처리기를 통해 다시 전달될 때 처리기는 다음 처리를 수행합니다.

    1. Cryostat 공개 키를 사용하여 서명을 확인합니다.
    2. Alice의 개인 키를 사용하여 Cryostat 본문의 암호를 해독합니다.

6.2.3. AsymmetricBinding 정책 지정

6.2.3.1. 개요

비대칭 바인딩 정책은 비대칭 키 알고리즘(공용/개인 키 조합)을 사용하여 Cryostat 메시지 보호를 구현하며 Loki 계층에서 이를 수행합니다. 비대칭 바인딩에서 사용하는 암호화 및 서명 알고리즘은 SSL/TLS에서 사용하는 암호화 및 서명 알고리즘과 유사합니다. 그러나 중요한 차이점은 Cryostat 메시지 보호를 통해 메시지의 특정 부분을 선택하여 보호 할 수 있다는 것입니다 (예: 개별 헤더, 본문 또는 첨부 파일) 반면 전송 계층 보안은 전체 메시지에서만 작동할 수 있다는 것입니다.

6.2.3.2. 정책 제목

비대칭 바인딩 정책은 끝점 정책 제목에 적용해야 합니다( “끝점 정책 제목”참조). 예를 들어 ID가 있는 비대칭 바인딩 정책이 경우 MutualCertificate10SignEncrypt_IPingService_policy 에서는 다음과 같이 정책을 끝점 바인딩에 적용할 수 있습니다.

<wsdl:binding name="MutualCertificate10SignEncrypt_IPingService" type="i0:IPingService">
  <wsp:PolicyReference URI="#MutualCertificate10SignEncrypt_IPingService_policy"/>
  ...
</wsdl:binding>

6.2.3.3. 구문

AsymmetricBinding 요소에는 다음과 같은 구문이 있습니다.

<sp:AsymmetricBinding xmlns:sp="..." ... >
  <wsp:Policy xmlns:wsp="...">
  (
   <sp:InitiatorToken>
     <wsp:Policy> ... </wsp:Policy>
   </sp:InitiatorToken>
  ) | (
   <sp:InitiatorSignatureToken>
     <wsp:Policy> ... </wsp:Policy>
   </sp:InitiatorSignatureToken>
   <sp:InitiatorEncryptionToken>
     <wsp:Policy> ... </wsp:Policy>
   </sp:InitiatorEncryptionToken>
  )
  (
   <sp:RecipientToken>
     <wsp:Policy> ... </wsp:Policy>
   </sp:RecipientToken>
  ) | (
   <sp:RecipientSignatureToken>
     <wsp:Policy> ... </wsp:Policy>
   </sp:RecipientSignatureToken>
   <sp:RecipientEncryptionToken>
     <wsp:Policy> ... </wsp:Policy>
   </sp:RecipientEncryptionToken>
  )
   <sp:AlgorithmSuite ... > ... </sp:AlgorithmSuite>
   <sp:Layout ... > ... </sp:Layout> ?
   <sp:IncludeTimestamp ... /> ?
   <sp:EncryptBeforeSigning ... /> ?
   <sp:EncryptSignature ... /> ?
   <sp:ProtectTokens ... /> ?
   <sp:OnlySignEntireHeadersAndBody ... /> ?
   ...
  </wsp:Policy>
  ...
</sp:AsymmetricBinding>

6.2.3.4. 정책 샘플

예 6.4. “Asymmetric Binding의 예” 서명 및 암호화를 사용한 메시지 보호를 지원하는 비대칭 바인딩의 예를 보여줍니다. 여기서 서명 및 암호화는 공개/개인 키(즉, 비대칭 암호화 사용) 쌍을 사용하여 수행됩니다. 그러나 이 예제에서는 서명하고 암호화해야 하는 메시지의 부분을 지정하지 않습니다. 이를 수행하는 방법에 대한 자세한 내용은 6.2.5절. “암호화 및 서명할 메시지의 일부 지정” 을 참조하십시오.

예 6.4. Asymmetric Binding의 예

<wsp:Policy wsu:Id="MutualCertificate10SignEncrypt_IPingService_policy">
  <wsp:ExactlyOne>
    <wsp:All>
      <sp:AsymmetricBinding
          xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
        <wsp:Policy>
          <sp:InitiatorToken>
            <wsp:Policy>
              <sp:X509Token
                  sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
                <wsp:Policy>
                  <sp:WssX509V3Token10/>
                </wsp:Policy>
              </sp:X509Token>
            </wsp:Policy>
          </sp:InitiatorToken>
          <sp:RecipientToken>
            <wsp:Policy>
              <sp:X509Token
                  sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/Never">
                <wsp:Policy>
                  <sp:WssX509V3Token10/>
                </wsp:Policy>
              </sp:X509Token>
            </wsp:Policy>
          </sp:RecipientToken>
          <sp:AlgorithmSuite>
            <wsp:Policy>
              <sp:Basic256/>
            </wsp:Policy>
          </sp:AlgorithmSuite>
          <sp:Layout>
            <wsp:Policy>
              <sp:Lax/>
            </wsp:Policy>
          </sp:Layout>
          <sp:IncludeTimestamp/>
          <sp:EncryptSignature/>
          <sp:OnlySignEntireHeadersAndBody/>
        </wsp:Policy>
      </sp:AsymmetricBinding>
      <sp:Wss10 xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
        <wsp:Policy>
          <sp:MustSupportRefKeyIdentifier/>
          <sp:MustSupportRefIssuerSerial/>
        </wsp:Policy>
      </sp:Wss10>
    </wsp:All>
  </wsp:ExactlyOne>
</wsp:Policy>

6.2.3.5. sp:InitiatorToken

이니시에이터 토큰은 이니시에이터 가 소유한 공개/개인 키 쌍을 나타냅니다. 이 토큰은 다음과 같이 사용됩니다.

  • 토큰의 개인 키는 이니시에이터에서 수신자로 전송된 메시지에 서명합니다.
  • 토큰의 공개 키는 수신자가 수신한 서명을 확인합니다.
  • 토큰의 공개 키는 수신자에서 이니시에이터로 전송된 메시지를 암호화합니다.
  • 토큰의 개인 키는 이니시에이터가 수신한 메시지를 해독합니다.

혼동적으로 이 토큰은 이니시에이터 수신자가 모두 사용합니다. 그러나 초기자만 개인 키에 액세스할 수 있으므로 이러한 경우 토큰은 이니시에이터에 속한다고 할 수 있습니다. 6.2.2절. “기본 서명 및 암호화 시나리오” 에서 이니시에이터 토큰은 인증서인 Alice입니다.

이 요소에는 표시된 대로 중첩된 wsp:Policy 요소 및 sp:X509Token 요소가 포함되어야 합니다. sp:IncludeToken 속성은 AlwaysToRecipient 로 설정되어 있으며, 이는 수신자에게 전송되는 모든 메시지와 함께 Alice의 공개 키를 포함하도록 런타임에 지시합니다. 이 옵션은 수신자가 이니시에이터의 인증서를 사용하여 인증을 수행하려는 경우 유용합니다. 가장 깊이 중첩된 요소인 WssX509V3Token10 은 선택 사항입니다. X.509 인증서가 준수해야 하는 사양 버전을 지정합니다. 여기에서는 다음 대안(또는 none)을 지정할 수 있습니다.

sp:WssX509V3Token10
이 선택적 요소는 X509 버전 3 토큰을 사용해야 함을 나타내는 정책 어설션입니다.
sp:WssX509Pkcs7Token10
이 선택적 요소는 X509 PKCS7 토큰을 사용해야 함을 나타내는 정책 어설션입니다.
sp:WssX509PkiPathV1Token10
이 선택적 요소는 X509 PKI 경로 버전 1 토큰을 사용해야 함을 나타내는 정책 어설션입니다.
sp:WssX509V1Token11
이 선택적 요소는 X509 버전 1 토큰을 사용해야 함을 나타내는 정책 어설션입니다.
sp:WssX509V3Token11
이 선택적 요소는 X509 버전 3 토큰을 사용해야 함을 나타내는 정책 어설션입니다.
sp:WssX509Pkcs7Token11
이 선택적 요소는 X509 PKCS7 토큰을 사용해야 함을 나타내는 정책 어설션입니다.
sp:WssX509PkiPathV1Token11
이 선택적 요소는 X509 PKI 경로 버전 1 토큰을 사용해야 함을 나타내는 정책 어설션입니다.

6.2.3.6. sp:RecipientToken

수신자 토큰은 수신자 가 소유한 공개/개인 키 쌍을 나타냅니다. 이 토큰은 다음과 같이 사용됩니다.

  • 토큰의 공개 키는 이니시에이터에서 수신자로 전송된 메시지를 암호화합니다.
  • 토큰의 개인 키는 수신자가 수신한 메시지를 해독합니다.
  • 토큰의 개인 키는 수신자에서 이니시에이터로 전송된 메시지에 서명합니다.
  • 토큰의 공개 키는 이니시에이터에서 수신한 서명을 확인합니다.

혼동적으로 이 토큰은 수신자 이니시에이터에서 모두 사용됩니다. 그러나 수신자만 개인 키에 액세스할 수 있으므로 이러한 경우 토큰은 수신자에 속한다고 할 수 있습니다. 6.2.2절. “기본 서명 및 암호화 시나리오” 에서 수신자 토큰은 인증서인 Cryostat입니다.

이 요소에는 표시된 대로 중첩된 wsp:Policy 요소 및 sp:X509Token 요소가 포함되어야 합니다. sp:IncludeToken 속성은 응답 메시지에 Cryostat의 공개 키를 포함할 필요가 없기 때문에 Never 로 설정됩니다.

참고

Apache CXF에서는 Cryostat의 인증서와 Alice의 인증서가 모두 연결 종료 시 제공되기 때문에 message에 Cryostat 또는 Alice의 토큰을 보낼 필요가 없습니다. 6.2.6절. “암호화 키 및 서명 키 제공” 참조.

6.2.3.7. sp:AlgorithmSuite

이 요소는 서명 및 암호화에 사용할 암호화 알고리즘 제품군을 지정합니다. 사용 가능한 알고리즘 모음에 대한 자세한 내용은 6.2.7절. “알고리즘 모음 지정” 을 참조하십시오.

6.2.3.8. sp:Layout

이 요소는 보안 헤더가 Cryostat 메시지에 추가되는 순서에 조건을 적용할지 여부를 지정합니다. sp:Lax 요소는 보안 헤더 순서에 조건이 적용되지 않도록 지정합니다. sp:Lax 의 대안은 sp: Ssimplet ,sp:LaxTimestampFirst 또는 sp:LaxTimestampLast 입니다.

6.2.3.9. sp:IncludeTimestamp

이 요소가 정책에 포함된 경우 런타임은 wsu:Timestamp 요소를 wsse:Security 헤더에 추가합니다. 기본적으로 타임스탬프는 포함되지 않습니다.

6.2.3.10. sp:EncryptBeforeSigning

메시지 부분에 암호화 및 서명이 모두 적용되는 경우 이러한 작업이 수행되는 순서를 지정해야 합니다. 기본 순서는 암호화하기 전에 서명하는 것입니다. 그러나 이 요소를 비대칭 정책에 포함하는 경우 서명 전에 암호화하도록 순서가 변경됩니다.

참고

암시적으로 이 요소는 암호 해독 및 서명 확인 작업의 순서에도 영향을 미칩니다. 예를 들어, 암호화하기 전에 메시지 발신자가 서명하는 경우 메시지의 수신자는 서명을 확인하기 전에 암호를 해독해야 합니다.

6.2.3.11. sp:EncryptSignature

이 요소는 메시지 서명이 6.2.6절. “암호화 키 및 서명 키 제공”에 설명된 대로 지정된 암호화 토큰에 의해 암호화되도록 지정합니다. 기본값은 false입니다.

참고

메시지 서명 은 메시지 본문, 메시지 헤더 또는 개별 요소와 같은 메시지의 다양한 부분에 서명하여 직접 얻은 서명입니다( 6.2.5절. “암호화 및 서명할 메시지의 일부 지정”참조). WS-SecurityPolicy 사양은 기본 서명에 서명 하는 데 사용되는 지원 토큰의 개념도 지원하므로 메시지 서명을 기본 서명이라고 합니다. 따라서 sp:EndorsingTokens 요소가 끝점에 적용되는 경우 메시지 자체에 서명하는 기본 서명과 기본 서명에 서명하는 보조 서명이라는 서명 체인이 있을 수 있습니다.

다양한 종류의 지원 토큰에 대한 자세한 내용은 “SupportingTokens 어설션” 을 참조하십시오.

6.2.3.12. sp:ProtectTokens

이 요소는 서명이 해당 서명을 생성하는 데 사용되는 토큰을 포함해야 함을 지정합니다. 기본값은 false입니다.

6.2.3.13. sp:OnlySignEntireHeadersAndBody

이 요소는 서명이 전체 본문 또는 전체 헤더에 적용할 수 있고 본문의 하위 요소 또는 헤더의 하위 요소에만 적용할 수 있도록 지정합니다. 이 옵션을 활성화하면 sp:Signed Cryostats 어설션을 효과적으로 사용할 수 없습니다( 6.2.5절. “암호화 및 서명할 메시지의 일부 지정”참조).

6.2.4. SymmetricBinding 정책 지정

6.2.4.1. 개요

대칭 바인딩 정책은 대칭 키 알고리즘(공유 비밀 키)을 사용하여 Cryostat 메시지 보호를 구현하며 Loki 계층에서 이를 수행합니다. 대칭 바인딩의 예로는 Kerberos 프로토콜 및 WS-SecureConversation 프로토콜이 있습니다.

참고

현재 Apache CXF는 대칭 바인딩에서 WS-SecureConversation 토큰 지원합니다.

6.2.4.2. 정책 제목

대칭 바인딩 정책은 끝점 정책 주체에 적용해야 합니다( “끝점 정책 제목”참조). 예를 들어 ID가 있는 대칭 바인딩 정책이 SecureConversation_MutualCertificate10SignEncrypt_IPingService_policy 인 경우 다음과 같이 정책을 엔드포인트 바인딩에 적용할 수 있습니다.

<wsdl:binding name="SecureConversation_MutualCertificate10SignEncrypt_IPingService" type="i0:IPingService">
  <wsp:PolicyReference URI="#SecureConversation_MutualCertificate10SignEncrypt_IPingService_policy"/>
  ...
</wsdl:binding>

6.2.4.3. 구문

SymmetricBinding 요소에는 다음과 같은 구문이 있습니다.

<sp:SymmetricBinding xmlns:sp="..." ... >
  <wsp:Policy xmlns:wsp="...">
  (
   <sp:EncryptionToken ... >
     <wsp:Policy> ... </wsp:Policy>
   </sp:EncryptionToken>
   <sp:SignatureToken ... >
     <wsp:Policy> ... </wsp:Policy>
   </sp:SignatureToken>
  ) | (
   <sp:ProtectionToken ... >
     <wsp:Policy> ... </wsp:Policy>
   </sp:ProtectionToken>
  )
   <sp:AlgorithmSuite ... > ... </sp:AlgorithmSuite>
   <sp:Layout ... > ... </sp:Layout> ?
   <sp:IncludeTimestamp ... /> ?
   <sp:EncryptBeforeSigning ... /> ?
   <sp:EncryptSignature ... /> ?
   <sp:ProtectTokens ... /> ?
   <sp:OnlySignEntireHeadersAndBody ... /> ?
   ...
  </wsp:Policy>
  ...
</sp:SymmetricBinding>

6.2.4.4. 정책 샘플

예 6.5. “Symmetric Binding의 예” 서명 및 암호화를 사용한 메시지 보호를 지원하는 대칭 바인딩의 예를 보여줍니다. 여기서 서명 및 암호화는 단일 대칭 키(즉, 대칭 암호화 사용)를 사용하여 수행됩니다. 그러나 이 예제에서는 서명하고 암호화해야 하는 메시지의 부분을 지정하지 않습니다. 이를 수행하는 방법에 대한 자세한 내용은 6.2.5절. “암호화 및 서명할 메시지의 일부 지정” 을 참조하십시오.

예 6.5. Symmetric Binding의 예

<wsp:Policy wsu:Id="SecureConversation_MutualCertificate10SignEncrypt_IPingService_policy">
  <wsp:ExactlyOne>
    <wsp:All>
      <sp:SymmetricBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
        <wsp:Policy>
          <sp:ProtectionToken>
            <wsp:Policy>
              <sp:SecureConversationToken>
                ...
              </sp:SecureConversationToken>
            </wsp:Policy>
          </sp:ProtectionToken>
          <sp:AlgorithmSuite>
            <wsp:Policy>
              <sp:Basic256/>
            </wsp:Policy>
          </sp:AlgorithmSuite>
          <sp:Layout>
            <wsp:Policy>
              <sp:Lax/>
            </wsp:Policy>
          </sp:Layout>
          <sp:IncludeTimestamp/>
          <sp:EncryptSignature/>
          <sp:OnlySignEntireHeadersAndBody/>
        </wsp:Policy>
      </sp:SymmetricBinding>
      <sp:Wss10 xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
        <wsp:Policy>
          <sp:MustSupportRefKeyIdentifier/>
          <sp:MustSupportRefIssuerSerial/>
        </wsp:Policy>
      </sp:Wss10>
      ...
    </wsp:All>
  </wsp:ExactlyOne>
</wsp:Policy>

6.2.4.5. sp:ProtectionToken

이 요소는 메시지에 서명하고 암호화하는 데 사용할 대칭 토큰을 지정합니다. 예를 들어 여기에 WS-SecureConversation 토큰을 지정할 수 있습니다.

작업에 서명 및 암호화에 고유 토큰을 사용하려면 이 요소 대신 sp:SignatureToken 요소와 sp:EncryptionToken 요소를 사용합니다.

6.2.4.6. sp:SignatureToken

이 요소는 메시지 서명에 사용할 대칭 토큰을 지정합니다. sp:EncryptionToken 요소와 함께 사용해야 합니다.

6.2.4.7. sp:EncryptionToken

이 요소는 메시지를 암호화하는 데 사용할 대칭 토큰을 지정합니다. sp:SignatureToken 요소와 함께 사용해야 합니다.

6.2.4.8. sp:AlgorithmSuite

이 요소는 서명 및 암호화에 사용할 암호화 알고리즘 제품군을 지정합니다. 사용 가능한 알고리즘 모음에 대한 자세한 내용은 6.2.7절. “알고리즘 모음 지정” 을 참조하십시오.

6.2.4.9. sp:Layout

이 요소는 보안 헤더가 Cryostat 메시지에 추가되는 순서에 조건을 적용할지 여부를 지정합니다. sp:Lax 요소는 보안 헤더 순서에 조건이 적용되지 않도록 지정합니다. sp:Lax 의 대안은 sp: Ssimplet ,sp:LaxTimestampFirst 또는 sp:LaxTimestampLast 입니다.

6.2.4.10. sp:IncludeTimestamp

이 요소가 정책에 포함된 경우 런타임은 wsu:Timestamp 요소를 wsse:Security 헤더에 추가합니다. 기본적으로 타임스탬프는 포함되지 않습니다.

6.2.4.11. sp:EncryptBeforeSigning

메시지 부분에 암호화 및 서명이 모두 적용되면 이러한 작업이 수행되는 순서를 지정해야 합니다. 기본 순서는 암호화하기 전에 서명하는 것입니다. 그러나 대칭 정책에 이 요소를 포함하는 경우 서명 전에 암호화하도록 순서가 변경됩니다.

참고

암시적으로 이 요소는 암호 해독 및 서명 확인 작업의 순서에도 영향을 미칩니다. 예를 들어, 암호화하기 전에 메시지 발신자가 서명하는 경우 메시지의 수신자는 서명을 확인하기 전에 암호를 해독해야 합니다.

6.2.4.12. sp:EncryptSignature

이 요소는 메시지 서명이 암호화되어야 함을 지정합니다. 기본값은 false입니다.

6.2.4.13. sp:ProtectTokens

이 요소는 서명이 해당 서명을 생성하는 데 사용되는 토큰을 포함해야 함을 지정합니다. 기본값은 false입니다.

6.2.4.14. sp:OnlySignEntireHeadersAndBody

이 요소는 서명이 전체 본문 또는 전체 헤더에 적용할 수 있고 본문의 하위 요소 또는 헤더의 하위 요소에만 적용할 수 있도록 지정합니다. 이 옵션을 활성화하면 sp:Signed Cryostats 어설션을 효과적으로 사용할 수 없습니다( 6.2.5절. “암호화 및 서명할 메시지의 일부 지정”참조).

6.2.5. 암호화 및 서명할 메시지의 일부 지정

6.2.5.1. 개요

암호화 및 서명은 각각 기밀성과 무결성이라는 두 가지 종류의 보호를 제공합니다. WS-SecurityPolicy 보호 어설션은 보호 대상 메시지의 일부를 지정하는 데 사용됩니다. 보호 메커니즘에 대한 자세한 내용은 관련 바인딩 정책에 별도로 지정됩니다(x6.2.3절. “AsymmetricBinding 정책 지정”, 6.2.4절. “SymmetricBinding 정책 지정”, 6.1절. “전송 계층 메시지 보호”참조).

여기에 설명된 보호 어설션은 Cryostat 메시지의 기능에 적용되기 때문에 issuer security와 함께 사용하기 위한 것입니다. 물론 이러한 정책은 특정 부분이 아닌 전체 메시지에 보호를 적용하는 전송 바인딩(예: HTTPS)에 의해 충족될 수 있습니다.

6.2.5.2. 정책 제목

보호 어설션은 메시지 정책 주체에 적용해야 합니다( “메시지 정책 제목”참조). 즉, WSDL 바인딩의 wsdl:input,wsdl:output 또는 wsdl:fault 요소 내에 배치해야 합니다. 예를 들어 ID가 있는 보호 정책인 MutualCertificate10SignEncrypt_IPingService_header_Input_policy 인 경우 다음과 같이 정책을 wsdl:input 메시지 부분에 적용할 수 있습니다.

<wsdl:operation name="header">
  <soap:operation soapAction="http://InteropBaseAddress/interop/header" style="document"/>
  <wsdl:input name="headerRequest">
    <wsp:PolicyReference
        URI="#MutualCertificate10SignEncrypt_IPingService_header_Input_policy"/>
      <soap:header message="i0:headerRequest_Headers" part="CustomHeader" use="literal"/>
      <soap:body use="literal"/>
    </wsdl:input>
    ...
</wsdl:operation>

6.2.5.3. 보호 어설션

다음 WS-SecurityPolicy 보호 어설션은 Apache CXF에서 지원합니다.

  • SignedParts
  • EncryptedParts
  • SignedElements
  • EncryptedElements
  • ContentEncryptedElements
  • RequiredElements
  • RequiredParts

6.2.5.4. 구문

SignedParts 요소에는 다음과 같은 구문이 있습니다.

<sp:SignedParts xmlns:sp="..." ... >
  <sp:Body />?
  <sp:Header Name="xs:NCName"? Namespace="xs:anyURI" ... />*
  <sp:Attachments />?
  ...
</sp:SignedParts>

EncryptedParts 요소에는 다음과 같은 구문이 있습니다.

<sp:EncryptedParts xmlns:sp="..." ... >
  <sp:Body/>?
  <sp:Header Name="xs:NCName"? Namespace="xs:anyURI" ... />*
  <sp:Attachments />?
  ...
</sp:EncryptedParts>

6.2.5.5. 정책 샘플

예 6.6. “무결성 및 암호화 정책 지원” 두 가지 보호 어설션, 즉 서명된 부분 어설션 및 암호화된 부분 어설션을 결합하는 정책을 표시합니다. 이 정책이 메시지 부분에 적용되면 영향을 받는 메시지 본문이 서명되고 암호화됩니다. 또한 CustomHeader 라는 메시지 헤더가 서명됩니다.

예 6.6. 무결성 및 암호화 정책 지원

<wsp:Policy wsu:Id="MutualCertificate10SignEncrypt_IPingService_header_Input_policy">
    <wsp:ExactlyOne>
        <wsp:All>
            <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
                <sp:Body/>
                <sp:Header Name="CustomHeader" Namespace="http://InteropBaseAddress/interop"/>
            </sp:SignedParts>
            <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
                <sp:Body/>
            </sp:EncryptedParts>
        </wsp:All>
    </wsp:ExactlyOne>
</wsp:Policy>

6.2.5.6. sp:Body

이 요소는 보호(암호화 또는 서명)가 메시지의 본문에 적용되도록 지정합니다. 보호는 전체 메시지 본문(즉, soap:Body 요소, 해당 특성 및 해당 콘텐츠)에 적용됩니다.

6.2.5.7. sp:Header

이 요소는 Name 특성 및 Namespace 특성을 사용하여 헤더의 로컬 이름으로 지정된 Cryostat 헤더에 보호가 적용되도록 지정합니다. 보호는 특성 및 해당 콘텐츠를 포함하여 전체 메시지 헤더에 적용됩니다.

6.2.5.8. SP:Attachments

이 요소는 Attachments(SwA) 첨부 파일이 있는 모든 #159가 보호되도록 지정합니다.

6.2.6. 암호화 키 및 서명 키 제공

6.2.6.1. 개요

표준 WS-SecurityPolicy 정책은 보안 요구 사항을 일부 세부적으로 지정하도록 설계되었습니다(예: 보안 프로토콜, 보안 알고리즘, 토큰 유형, 인증 요구 사항 등)은 모두 설명되어 있습니다. 그러나 표준 정책 어설션은 키 및 자격 증명과 같은 관련 보안 데이터를 지정하기 위한 메커니즘을 제공하지 않습니다. WS-SecurityPolicy는 독점 메커니즘을 통해 필요한 보안 데이터를 제공할 것으로 예상합니다. Apache CXF에서는 블루프린트 XML 구성을 통해 관련 보안 데이터가 제공됩니다.

6.2.6.2. 암호화 키 및 서명 키 구성

클라이언트의 요청 컨텍스트 또는 끝점 컨텍스트에서 속성을 설정하여 애플리케이션의 암호화 키 및 서명 키를 지정할 수 있습니다( “블루프린트 구성에 암호화 및 서명 속성 추가”참조). 설정할 수 있는 속성은 표 6.1. “암호화 및 서명 속성” 에 표시됩니다.

표 6.1. 암호화 및 서명 속성

속성설명

security.signature.properties

WSS4J 속성 파일/오브젝트에 서명 키 저장소를 구성하기 위한 WSS4J 속성 파일/오브젝트(암호 해독에도 사용됨) 및 Crypto 오브젝트입니다.

security.signature.username

(선택 사항) 사용할 서명 키 저장소에 있는 키의 사용자 이름 또는 별칭입니다. 지정하지 않으면 속성 파일에 설정된 별칭이 사용됩니다. 또한 설정되지 않고 키 저장소에 단일 키만 포함된 경우 해당 키가 사용됩니다.

security.encryption.properties

WSS4J 속성 파일/오브젝트에 암호화 키 저장소를 구성하기 위한 WSS4J 속성(서명 확인에도 사용됨) 및 Crypto 오브젝트입니다.

security.encryption.username

(선택 사항) 사용할 암호화 키 저장소에 있는 키의 사용자 이름 또는 별칭입니다. 지정하지 않으면 속성 파일에 설정된 별칭이 사용됩니다. 또한 설정되지 않고 키 저장소에 단일 키만 포함된 경우 해당 키가 사용됩니다.

이전 속성의 이름은 사용되는 내용을 정확하게 반영하지 않기 때문에 잘 선택되지 않습니다. security.signature.properties 로 지정된 키는 서명 암호 해독에 실제로 사용됩니다. security.encryption.properties 로 지정된 키는 실제로 서명 암호화 검증에 사용됩니다.

6.2.6.3. 블루프린트 구성에 암호화 및 서명 속성 추가

Apache CXF 애플리케이션에서 WS-Policy 정책을 사용하려면 먼저 기본 CXF 버스에 정책 기능을 추가해야 합니다. 다음 블루프린트 구성 조각에 표시된 것처럼 p:policies 요소를 CXF 버스에 추가합니다.

<beans xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
       xmlns:jaxws="http://cxf.apache.org/jaxws"
       xmlns:cxf="http://cxf.apache.org/core"
       xmlns:p="http://cxf.apache.org/policy" ... >

    <cxf:bus>
        <cxf:features>
            <p:policies/>
            <cxf:logging/>
        </cxf:features>
    </cxf:bus>
    ...
</beans>

다음 예제에서는 지정된 서비스 유형의 프록시에 서명 및 암호화 속성을 추가하는 방법을 보여줍니다( jaxws:client 요소의 name 속성으로 서비스 이름이 지정됨). 속성은 WSS4J 속성 파일에 저장됩니다. 여기서 alice.properties 에는 서명 키의 속성이 포함되어 있으며 bob.properties 에는 암호화 키의 속성이 포함되어 있습니다.

<beans ... >
    <jaxws:client name="{http://InteropBaseAddress/interop}MutualCertificate10SignEncrypt_IPingService"
                  createdFromAPI="true">
        <jaxws:properties>
            <entry key="ws-security.signature.properties" value="etc/alice.properties"/>
            <entry key="ws-security.encryption.properties" value="etc/bob.properties"/>
        </jaxws:properties>
    </jaxws:client>
    ...
</beans>

실제로 속성 이름에서는 명확하지 않지만 이러한 각 키는 클라이언트 측의 두 가지 용도로 사용됩니다.

  • Alice.properties (즉, security.signature.properties에 의해 지정된 키)는 다음과 같이 클라이언트 측에서 사용됩니다.

    • 발신 메시지에 서명하는 경우.
    • 들어오는 메시지의 암호를 해독합니다.
  • Cryostat.properties (즉, security.encryption.properties에 의해 지정된 키)는 다음과 같이 클라이언트 측에서 사용됩니다.

    • 발신 메시지를 암호화하는 데 사용됩니다.
    • 수신되는 메시지에 대한 서명을 확인하는 데 사용됩니다.

이러한 혼동이 있는 경우 자세한 설명은 6.2.2절. “기본 서명 및 암호화 시나리오” 에서 참조하십시오.

다음 예제에서는 signature-WS 엔드포인트에 서명 및 암호화 속성을 추가하는 방법을 보여줍니다. 속성 파일 bob.properties 에는 서명 키 및 속성 파일의 속성이 포함되어 있습니다. alice.properties 에는 암호화 키의 속성이 포함되어 있습니다(클라이언트 구성의 역임).

<beans ... >
    <jaxws:endpoint
       name="{http://InteropBaseAddress/interop}MutualCertificate10SignEncrypt_IPingService"
       id="MutualCertificate10SignEncrypt"
       address="http://localhost:9002/MutualCertificate10SignEncrypt"
       serviceName="interop:PingService10"
       endpointName="interop:MutualCertificate10SignEncrypt_IPingService"
       implementor="interop.server.MutualCertificate10SignEncrypt">

        <jaxws:properties>
            <entry key="security.signature.properties" value="etc/bob.properties"/>
            <entry key="security.encryption.properties" value="etc/alice.properties"/>
        </jaxws:properties>

    </jaxws:endpoint>
    ...
</beans>

이러한 각 키는 서버 측의 두 가지 용도로 사용됩니다.

  • Cryostat.properties (즉, security.signature.properties에 의해 지정된 키)는 다음과 같이 서버 측에서 사용됩니다.

    • 발신 메시지에 서명하는 경우.
    • 들어오는 메시지의 암호를 해독합니다.
  • Alice.properties (즉, security.encryption.properties에 의해 지정된 키)는 다음과 같이 서버 측에서 사용됩니다.

    • 발신 메시지를 암호화하는 데 사용됩니다.
    • 수신되는 메시지에 대한 서명을 확인하는 데 사용됩니다.

6.2.6.4. WSS4J 속성 파일 정의

Apache CXF는 WSS4J 속성 파일을 사용하여 암호화 및 서명에 필요한 공개 키와 개인 키를 로드합니다. 표 6.2. “WSS4J 키 저장소 속성” 이러한 파일에서 설정할 수 있는 속성에 대해 설명합니다.

표 6.2. WSS4J 키 저장소 속성

속성설명

org.apache.ws.security.crypto.provider

Crypto 인터페이스 구현을 지정합니다( “WSS4J Crypto 인터페이스”참조). 일반적으로 Crypto,org.apache.ws.security.components.crypto.Merlin 의 기본 WSS4J 구현을 지정합니다.

이 표의 나머지 속성은 Crypto인터페이스의 Merlin 구현에 고유합니다.

org.apache.ws.security.crypto.merlin.keystore.provider

(선택 사항) 사용할 JSSE 키 저장소 공급자의 이름입니다. 기본 키 저장소 공급자는 Bouncy Castle 입니다. 이 속성을 SunJSSE 로 설정하여 공급자를 Sun's JSSE 키 저장소 공급자로 전환할 수 있습니다.

org.apache.ws.security.crypto.merlin.keystore.type

Bouncy Castle 키 저장소 공급자는 JKSPKCS12 키 저장소를 지원합니다. 또한 Bouncy Castle은 BKS 및 UBER와 같은 독점 키 저장소 유형을 지원합니다.

org.apache.ws.security.crypto.merlin.keystore.file

로드할 키 저장소 파일의 위치를 지정합니다. 여기서 위치는 Classpath에 상대적으로 지정됩니다.

org.apache.ws.security.crypto.merlin.keystore.alias

(선택 사항) 키 저장소 유형이 JKS (Java 키 저장소)인 경우 별칭을 지정하여 키 저장소에서 특정 키를 선택할 수 있습니다. 키 저장소에 하나의 키만 포함된 경우 별칭을 지정할 필요가 없습니다.

org.apache.ws.security.crypto.merlin.keystore.password

이 속성에서 지정하는 암호는 두 가지 용도로 사용됩니다. 키 저장소(키 저장소 암호)를 해제하고 키 저장소에 저장된 개인 키의 암호를 해독하는 데 사용됩니다(개인 키 암호). 따라서 키 저장소 암호는 개인 키 암호와 동일해야 합니다.

예를 들어 etc/alice.properties 파일에는 다음과 같이 PKCS#12 파일 certs/alice.pfx 를 로드하는 속성 설정이 포함되어 있습니다.

org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin

org.apache.ws.security.crypto.merlin.keystore.type=PKCS12
org.apache.ws.security.crypto.merlin.keystore.password=password
org.apache.ws.security.crypto.merlin.keystore.file=certs/alice.pfx

etc/bob.properties 파일에는 다음과 같이 PKCS#12 파일 certs/bob.pfx 를 로드하는 속성 설정이 포함되어 있습니다.

org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin

org.apache.ws.security.crypto.merlin.keystore.password=password

# for some reason, bouncycastle has issues with bob.pfx
org.apache.ws.security.crypto.merlin.keystore.provider=SunJSSE
org.apache.ws.security.crypto.merlin.keystore.type=PKCS12
org.apache.ws.security.crypto.merlin.keystore.file=certs/bob.pfx

6.2.6.5. 암호화 키 및 서명 키 프로그래밍

암호화 키와 서명 키를 로드하는 다른 방법은 표 6.3. “Crypto 오브젝트 지정을 위한 속성” 에 표시된 속성을 사용하여 관련 키를 로드하는 Crypto 오브젝트를 지정하는 것입니다. 이를 위해서는 WSS4J Crypto 인터페이스 org.apache.ws.security.components.crypto.Crypto 의 자체 구현을 제공해야 합니다.

표 6.3. Crypto 오브젝트 지정을 위한 속성

속성설명

security.signature.crypto

메시지에 서명하고 암호를 해독하기 위한 키를 로드하는 Crypto 오브젝트의 인스턴스를 지정합니다.

security.encryption.crypto

메시지를 암호화하고 서명을 확인하는 데 필요한 키를 로드하는 Crypto 오브젝트의 인스턴스를 지정합니다.

6.2.6.6. WSS4J Crypto 인터페이스

예 6.7. “WSS4J Crypto 인터페이스” 프로그래밍을 통해 암호화 키와 서명 키를 제공하려는 경우 구현할 수 있는 Crypto 인터페이스의 정의를 표시합니다. 자세한 내용은 WSS4J 홈 페이지를 참조하십시오.

예 6.7. WSS4J Crypto 인터페이스

// Java
package org.apache.ws.security.components.crypto;

import org.apache.ws.security.WSSecurityException;

import java.io.InputStream;
import java.math.BigInteger;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

public interface Crypto {
    X509Certificate loadCertificate(InputStream in)
    throws WSSecurityException;

    X509Certificate[] getX509Certificates(byte[] data, boolean reverse)
    throws WSSecurityException;

    byte[] getCertificateData(boolean reverse, X509Certificate[] certs)
    throws WSSecurityException;

    public PrivateKey getPrivateKey(String alias, String password)
    throws Exception;

    public X509Certificate[] getCertificates(String alias)
    throws WSSecurityException;

    public String getAliasForX509Cert(Certificate cert)
    throws WSSecurityException;

    public String getAliasForX509Cert(String issuer)
    throws WSSecurityException;

    public String getAliasForX509Cert(String issuer, BigInteger serialNumber)
    throws WSSecurityException;

    public String getAliasForX509Cert(byte[] skiBytes)
    throws WSSecurityException;

    public String getDefaultX509Alias();

    public byte[] getSKIBytesFromCert(X509Certificate cert)
    throws WSSecurityException;

    public String getAliasForX509CertThumb(byte[] thumb)
    throws WSSecurityException;

    public KeyStore getKeyStore();

    public CertificateFactory getCertificateFactory()
    throws WSSecurityException;

    public boolean validateCertPath(X509Certificate[] certs)
    throws WSSecurityException;

    public String[] getAliasesForDN(String subjectDN)
    throws WSSecurityException;
}

6.2.7. 알고리즘 모음 지정

6.2.7.1. 개요

알고리즘 모음은 서명, 암호화, 메시지 다이제스트 생성 등과 같은 작업을 수행하기 위한 일관된 암호화 알고리즘 컬렉션입니다.

참조용으로 이 섹션에서는 WS-SecurityPolicy 사양에 정의된 알고리즘 모음에 대해 설명합니다. 그러나 특정 알고리즘 모음을 사용할 수 있는지 여부는 기본 보안 공급자에 따라 다릅니다. Apache CXF 보안은 JCE(Pluggable Java Cryptography Extension) 및 JSSE(Java Secure Socket Extension) 계층을 기반으로 합니다. 기본적으로 Apache CXF는 Sun의 JSSE 공급자로 구성되며, Sun의 JSSE 참조 가이드부록 A 에 설명된 암호화 제품군을 지원합니다.

6.2.7.2. 구문

AlgorithmSuite 요소에는 다음과 같은 구문이 있습니다.

<sp:AlgorithmSuite xmlns:sp="..." ... >
  <wsp:Policy xmlns:wsp="...">
   (<sp:Basic256 ... /> |
    <sp:Basic192 ... /> |
    <sp:Basic128 ... /> |
    <sp:TripleDes ... /> |
    <sp:Basic256Rsa15 ... /> |
    <sp:Basic192Rsa15 ... /> |
    <sp:Basic128Rsa15 ... /> |
    <sp:TripleDesRsa15 ... /> |
    <sp:Basic256Sha256 ... /> |
    <sp:Basic192Sha256 ... /> |
    <sp:Basic128Sha256 ... /> |
    <sp:TripleDesSha256 ... /> |
    <sp:Basic256Sha256Rsa15 ... /> |
    <sp:Basic192Sha256Rsa15 ... /> |
    <sp:Basic128Sha256Rsa15 ... /> |
    <sp:TripleDesSha256Rsa15 ... /> |
    ...)
    <sp:InclusiveC14N ... /> ?
    <sp:SOAPNormalization10 ... /> ?
    <sp:STRTransform10 ... /> ?
   (<sp:XPath10 ... /> |
    <sp:XPathFilter20 ... /> |
    <sp:AbsXPath ... /> |
    ...)?
    ...
  </wsp:Policy>
  ...
</sp:AlgorithmSuite>

알고리즘 제품군 어설션은 많은 대체 알고리즘(예: Basic256)을 지원합니다. 알고리즘 모음 대안에 대한 자세한 설명은 표 6.4. “알고리즘 모음” 을 참조하십시오.

6.2.7.3. 알고리즘 모음

표 6.4. “알고리즘 모음” WS-SecurityPolicy에서 지원하는 알고리즘 모음에 대한 요약을 제공합니다. 열 제목은 다음과 같이 다양한 유형의 암호화 알고리즘을 나타냅니다. \[Dig]는 다이제스트 알고리즘입니다. \[Enc]는 암호화 알고리즘입니다. \[Sym KW]는 대칭 키 래핑 알고리즘입니다. \[Enc KW]는 비대칭 키 래핑 알고리즘입니다. \[Enc KD]는 암호화 키 파생 알고리즘입니다. \[Enc KD] is the symmetric key-wrap algorithm; \[Sym KW] is the symmetric key-wrap algorithm; \[Enc KD]

표 6.4. 알고리즘 모음

알고리즘 모음\[Dig]\[Enc]\[Sym KW]\[Asym KW]\[Enc KD]\[Sig KD]

Basic256

Sha1

Aes256

KwAes256

KwRsaOaep

PSha1L256

PSha1L192

Basic192

Sha1

Aes192

KwAes192

KwRsaOaep

PSha1L192

PSha1L192

Basic128

Sha1

Aes128

KwAes128

KwRsaOaep

PSha1L128

PSha1L128

TripleDes

Sha1

TripleDes

KwTripleDes

KwRsaOaep

PSha1L192

PSha1L192

Basic256Rsa15

Sha1

Aes256

KwAes256

KwRsa15

PSha1L256

PSha1L192

Basic192Rsa15

Sha1

Aes192

KwAes192

KwRsa15

PSha1L192

PSha1L192

Basic128Rsa15

Sha1

Aes128

KwAes128

KwRsa15

PSha1L128

PSha1L128

TripleDesRsa15

Sha1

TripleDes

KwTripleDes

KwRsa15

PSha1L192

PSha1L192

Basic256Sha256

Sha256

Aes256

KwAes256

KwRsaOaep

PSha1L256

PSha1L192

Basic192Sha256

Sha256

Aes192

KwAes192

KwRsaOaep

PSha1L192

PSha1L192

Basic128Sha256

Sha256

Aes128

KwAes128

KwRsaOaep

PSha1L128

PSha1L128

TripleDesSha256

Sha256

TripleDes

KwTripleDes

KwRsaOaep

PSha1L192

PSha1L192

Basic256Sha256Rsa15

Sha256

Aes256

KwAes256

KwRsa15

PSha1L256

PSha1L192

Basic192Sha256Rsa15

Sha256

Aes192

KwAes192

KwRsa15

PSha1L192

PSha1L192

Basic128Sha256Rsa15

Sha256

Aes128

KwAes128

KwRsa15

PSha1L128

PSha1L128

TripleDesSha256Rsa15

Sha256

TripleDes

KwTripleDes

KwRsa15

PSha1L192

PSha1L192

6.2.7.4. 암호화 알고리즘 유형

WS-SecurityPolicy에서 지원하는 암호화 알고리즘 유형은 다음과 같습니다.

6.2.7.5. 대칭 키 서명

대칭 키 서명 속성 [Sym Sig]은 대칭 키를 사용하여 서명을 생성하는 알고리즘을 지정합니다. WS-SecurityPolicy는 HmacSha1 알고리즘이 항상 사용되도록 지정합니다.

HmacSha1 알고리즘은 다음 URI로 식별됩니다.

http://www.w3.org/2000/09/xmldsig#hmac-sha1

6.2.7.6. 비대칭 키 서명

비대칭 키 서명 속성 [Asym Sig]은 비대칭 키를 사용하여 서명을 생성하는 알고리즘을 지정합니다. WS-SecurityPolicy는 RsaSha1 알고리즘이 항상 사용되도록 지정합니다.

RsaSha1 알고리즘은 다음 URI로 식별됩니다.

http://www.w3.org/2000/09/xmldsig#rsa-sha1

6.2.7.7. 다이제스트

다이제스트 속성인 [Dig]는 메시지 다이제스트 값을 생성하는 데 사용되는 알고리즘을 지정합니다. WS-SecurityPolicy는 sha 1 및 Sha 256 이라는 두 가지 대체 다이제스트 알고리즘을 지원합니다.

Sha1 알고리즘은 다음 URI로 식별됩니다.

http://www.w3.org/2000/09/xmldsig#sha1

Sha256 알고리즘은 다음 URI로 식별됩니다.

http://www.w3.org/2001/04/xmlenc#sha256

6.2.7.8. 암호화

암호화 속성인 [Enc]는 데이터를 암호화하는 데 사용되는 알고리즘을 지정합니다. WS-SecurityPolicy는 다음과 같은 암호화 알고리즘을 지원합니다. Aes256,Aes192,Aes128,TripleDes.

Aes256 알고리즘은 다음 URI로 식별됩니다.

http://www.w3.org/2001/04/xmlenc#aes256-cbc

Aes192 알고리즘은 다음 URI로 식별됩니다.

http://www.w3.org/2001/04/xmlenc#aes192-cbc

Aes128 알고리즘은 다음 URI로 식별됩니다.

http://www.w3.org/2001/04/xmlenc#aes128-cbc

TripleDes 알고리즘은 다음 URI로 식별됩니다.

http://www.w3.org/2001/04/xmlenc#tripledes-cbc

6.2.7.9. 대칭 키 래핑

대칭 키 래핑 속성인 [Sym KW]는 대칭 키 서명 및 암호화에 사용되는 알고리즘을 지정합니다. WS-SecurityPolicy는 다음과 같은 대칭 키 래핑 알고리즘을 지원합니다. KwAes256,KwAes192,KwAes128,KwTripleDes.

KwAes256 알고리즘은 다음 URI로 식별됩니다.

http://www.w3.org/2001/04/xmlenc#kw-aes256

KwAes192 알고리즘은 다음 URI로 식별됩니다.

http://www.w3.org/2001/04/xmlenc#kw-aes192

KwAes128 알고리즘은 다음 URI로 식별됩니다.

http://www.w3.org/2001/04/xmlenc#kw-aes128

KwTripleDes 알고리즘은 다음 URI로 식별됩니다.

http://www.w3.org/2001/04/xmlenc#tripledes-cbc

6.2.7.10. 비대칭 키 래핑

비대칭 키 래핑 속성인 [Asym KW]는 비대칭 키를 서명하고 암호화하는 데 사용되는 알고리즘을 지정합니다. WS-SecurityPolicy는 다음과 같은 비대칭 키 래핑 알고리즘을 지원합니다. KwRsaOaep,KwRsa15.

KwRsaOaep 알고리즘은 다음 URI로 식별됩니다.

http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p

KwRsa15 알고리즘은 다음 URI로 식별됩니다.

http://www.w3.org/2001/04/xmlenc#rsa-1_5

6.2.7.11. 계산된 키

계산된 키 속성 [Comp Key]는 파생 키를 계산하는 데 사용되는 알고리즘을 지정합니다. 보안 당사자가 공유 비밀 키의 지원과 통신할 때(예: WS-SecureConversation 사용 시), 적대적인 타사의 분석을 위해 너무 많은 데이터를 노출하지 않으려면 원래 공유 키 대신 파생 키를 사용하는 것이 좋습니다. WS-SecurityPolicy는 PSha1 알고리즘이 항상 사용되도록 지정합니다.

PSha1 알고리즘은 다음 URI로 식별됩니다.

http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512/dk/p_sha1

6.2.7.12. 암호화 키 파생

암호화 키 파생 속성인 [Enc KD]는 파생 암호화 키를 계산하는 데 사용되는 알고리즘을 지정합니다. WS-SecurityPolicy는 다음과 같은 암호화 키 파생 알고리즘을 지원합니다. PSha1L256,PSha1L192,PSha1L128.

PSha1 알고리즘은 다음 URI로 식별됩니다( PSha1L256,PSha1L192PSha1L128 에 동일한 알고리즘이 사용됩니다. 키 길이는 다릅니다).

http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512/dk/p_sha1

6.2.7.13. 서명 키 파생

서명 키 파생 속성인 [Sig KD]는 파생된 서명 키를 계산하는 데 사용되는 알고리즘을 지정합니다. WS-SecurityPolicy는 다음과 같은 서명 키 파생 알고리즘을 지원합니다. PSha1L192,PSha1L128.

6.2.7.14. 키 길이 속성

표 6.5. “키 길이 속성” WS-SecurityPolicy에서 지원되는 최소 및 최대 키 길이를 표시합니다.

표 6.5. 키 길이 속성

속성키 길이

최소 대칭 키 길이 [Min SKL]

128, 192, 256

최대 대칭 키 길이 [Max SKL]

256

최소 비대칭 키 길이 [Min AKL]

1024

최대 비대칭 키 길이 [최대 AKL]

4096

최소 대칭 키 길이인 [Min SKL] 값은 선택한 알고리즘 모음에 따라 다릅니다.

7장. 인증

초록

이 장에서는 정책을 사용하여 Apache CXF 애플리케이션에서 인증을 구성하는 방법을 설명합니다. 현재 Cryostat 계층에서 지원되는 유일한 인증 정보 유형은 WS-Security UsernameToken입니다.

7.1. 인증 소개

7.1.1. 개요

Apache CXF에서는 블루프린트 XML의 WSDL 계약 및 구성 설정의 정책 어설션의 조합을 통해 인증을 사용하도록 애플리케이션을 설정할 수 있습니다.

참고

HTTPS 프로토콜을 인증 기반으로 사용할 수도 있으며 경우에 따라 더 쉽게 구성할 수 있습니다. 3.1절. “인증 대체 옵션”을 참조하십시오.

7.1.2. 인증을 설정하는 단계

개요에서는 인증을 사용하도록 애플리케이션을 설정하려면 다음 단계를 수행해야 합니다.

  1. WSDL 계약의 끝점에 지원 토큰 정책을 추가합니다. 이는 끝점에서 요청 메시지에 특정 유형의 토큰(클라이언트 인증 정보)을 포함해야 하는 효과가 있습니다.
  2. 클라이언트 측에서 블루프린트 XML에서 관련 엔드포인트를 구성하여 보낼 자격 증명을 제공합니다.
  3. (선택 사항) 클라이언트 측에서 콜백 처리기를 사용하여 암호를 제공하기로 결정한 경우 Java에서 콜백 처리기를 구현합니다.
  4. 서버 측에서 콜백 처리기 클래스를 블루프린트 XML의 끝점과 연결합니다. 그런 다음 콜백 처리기는 원격 클라이언트에서 수신된 인증 정보를 인증합니다.

7.2. 인증 정책 지정

7.2.1. 개요

끝점에서 인증을 지원하려면 지원 토큰 정책 어설션 을 관련 끝점 바인딩과 연결합니다. 여러 종류의 지원 토큰 정책 어설션이 있으며, 여기에는 모두 *지원Tokens (예: SupportingTokens,Signed SupportingTokens 등) 형식의 이름이 있습니다. 전체 목록은 “SupportingTokens 어설션” 에서 참조하십시오.

지원 토큰 어설션을 끝점과 연결하면 다음과 같은 효과가 있습니다.

  • 엔드포인트에서 또는 끝점에 대한 메시지는 지정된 토큰 유형을 포함해야 합니다(여기서 토큰의 방향이 sp:IncludeToken 특성에 의해 지정됨).
  • 사용하는 특정 유형의 지원 토큰 요소에 따라 토큰에 서명 및/또는 암호화해야 할 수 있습니다.

지원 토큰 어설션은 런타임에서 이러한 요구 사항이 충족되는지 확인하는 것을 의미합니다. 그러나 WS-SecurityPolicy 정책은 런타임에 자격 증명을 제공하는 메커니즘을 정의하지 않습니다. 블루프린트 XML 구성을 사용하여 인증 정보를 지정해야 합니다( 7.3절. “클라이언트 인증 정보 제공”참조).

7.2.2. 구문

*지원Tokens 요소(즉, SupportingTokens 접미사가 있는 모든 요소)에는 다음과 같은 구문이 있습니다. “SupportingTokens 어설션”

<sp:SupportingTokensElement xmlns:sp="..." ... >
  <wsp:Policy xmlns:wsp="...">
    [Token Assertion]+
    <sp:AlgorithmSuite ... > ... </sp:AlgorithmSuite> ?
    (
      <sp:SignedParts ... > ... </sp:SignedParts> |
      <sp:SignedElements ... > ... </sp:SignedElements> |
      <sp:EncryptedParts ... > ... </sp:EncryptedParts> |
      <sp:EncryptedElements ... > ... </sp:EncryptedElements> |
    ) *
    ...
  </wsp:Policy>
  ...
</sp:SupportingTokensElement>

여기서 SupportingTokens Cryostat는 지원 토큰 요소 *지원Tokens. typically, 보안 헤더에 토큰 (또는 토큰)을 포함하려는 경우 하나 이상의 토큰 어설션, [토큰 지원] 을 정책에 포함합니다. 특히 인증에 필요한 모든 것입니다.

토큰이 적절한 유형인 경우(예: X.509 인증서 또는 대칭 키) 이론적으로 sp:AlgorithmSuite,sp:SignedParts, sp:Signed Cryostats , sp:Encrypted Cryostats ,sp:Encrypted#159 s 요소를 사용하여 현재 메시지의 특정 부분을 서명 하거나 암호화 할 수 있습니다. 그러나 이 기능은 현재 Apache CXF에서 지원되지 않습니다.

7.2.3. 정책 샘플

예 7.1. “지원 토큰 정책 예” 보안 헤더에 포함될 WS-Security UsernameToken 토큰(사용자 이름/암호 자격 증명 포함)이 필요한 정책의 예를 보여줍니다. 또한 토큰이 sp:SignedSupportingTokens 요소 내에 지정되기 때문에 정책에 따라 토큰에 서명해야 합니다. 이 예에서는 전송 바인딩을 사용하므로 메시지에 서명해야 하는 기본 전송입니다.

예를 들어 기본 전송이 HTTPS인 경우 적절한 알고리즘 모음으로 구성된 SSL/TLS 프로토콜에서 지정된 토큰이 포함된 보안 헤더를 포함하여 전체 메시지에 서명해야 합니다. 이는 지원 토큰이 서명되는 요구 사항을 충족하기에 충분합니다.

예 7.1. 지원 토큰 정책 예

<wsp:Policy wsu:Id="UserNameOverTransport_IPingService_policy">
  <wsp:ExactlyOne>
    <wsp:All>
      <sp:TransportBinding> ... </sp:TransportBinding>
      <sp:SignedSupportingTokens
          xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
        <wsp:Policy>
          <sp:UsernameToken
              sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
            <wsp:Policy>
              <sp:WssUsernameToken10/>
            </wsp:Policy>
          </sp:UsernameToken>
        </wsp:Policy>
      </sp:SignedSupportingTokens>
      ...
    </wsp:All>
  </wsp:ExactlyOne>
</wsp:Policy>

sp:WssUsernameToken10 하위 요소가 있으면 UsernameToken 헤더가 WS-Security UsernameToken 사양의 버전 1.0을 준수해야 함을 나타냅니다.

7.2.4. 토큰 유형

기본적으로 지원 토큰 어설션에서 WS-SecurityPolicy 토큰 유형을 지정할 수 있습니다. 그러나 Cryostat 수준 인증의 경우 sp:UsernameToken 토큰 유형만 관련이 있습니다.

7.2.5. sp:UsernameToken

지원 토큰 어설션의 컨텍스트에서 이 요소는 WS-Security UsernameToken이 보안 Cryostat 헤더에 포함되도록 지정합니다. 기본적으로 WS-Security UsernameToken은 WS-Security Cryostat 헤더에서 사용자 이름/암호 자격 증명을 보내는 데 사용됩니다. sp:UsernameToken 요소에는 다음과 같은 구문이 있습니다.

<sp:UsernameToken sp:IncludeToken="xs:anyURI"? xmlns:sp="..." ... >
  (
    <sp:Issuer>wsa:EndpointReferenceType</sp:Issuer> |
    <sp:IssuerName>xs:anyURI</sp:IssuerName>
  ) ?
  <wst:Claims Dialect="..."> ... </wst:Claims> ?
  <wsp:Policy xmlns:wsp="...">
    (
      <sp:NoPassword ... /> |
      <sp:HashPassword ... />
    ) ?
    (
      <sp:RequireDerivedKeys /> |
      <sp:RequireImpliedDerivedKeys ... /> |
      <sp:RequireExplicitDerivedKeys ... />
    ) ?
    (
      <sp:WssUsernameToken10 ... /> |
      <sp:WssUsernameToken11 ... />
    ) ?
    ...
  </wsp:Policy>
  ...
</sp:UsernameToken>

sp:UsernameToken 의 하위 요소는 모두 선택 사항이며 일반 인증에 필요하지 않습니다. 일반적으로 이 구문의 유일한 부분은 sp:IncludeToken 속성입니다.

참고

현재 sp:UsernameToken 구문에서는 sp:WsssUsernameToken10 하위 요소만 Apache CXF에서 지원됩니다.

7.2.6. SP:IncludeToken 특성

sp:IncludeToken 의 값은 enclosing 정책의 WS-SecurityPolicy 버전과 일치해야 합니다. 현재 버전은 1.2이지만 레거시 WSDL은 버전 1.1을 사용할 수 있습니다. sp:IncludeToken 속성의 유효한 값은 다음과 같습니다.

Never

토큰은 개시자와 수신자 간에 전송된 메시지에 포함되지 않아야 합니다. 대신 토큰에 대한 외부 참조를 사용해야 합니다. 유효한 URI 값은 다음과 같습니다.

한 번

토큰은 개시자에서 수신자로 전송된 하나의 메시지에만 포함되어야 합니다. 토큰에 대한 참조는 내부 참조 메커니즘을 사용할 수 있습니다. 수신자와 이니시에이터 간에 전송된 후속 관련 메시지는 외부 참조 메커니즘을 사용하여 토큰을 참조할 수 있습니다. 유효한 URI 값은 다음과 같습니다.

AlwaysToRecipient

토큰은 이니시에이터에서 수신자로 전송된 모든 메시지에 포함되어야 합니다. 토큰은 수신자에서 이니시에이터로 전송된 메시지에 포함되지 않아야 합니다. 유효한 URI 값은 다음과 같습니다.

AlwaysToInitiator

토큰은 수신자에서 이니시에이터로 전송된 모든 메시지에 포함되어야 합니다. 토큰은 개시자에서 수신자로 전송된 메시지에 포함되지 않아야 합니다. 유효한 URI 값은 다음과 같습니다.

Always

토큰은 개시자와 수신자 간에 전송된 모든 메시지에 포함되어야 합니다. 이는 기본 동작입니다. 유효한 URI 값은 다음과 같습니다.

7.2.7. SupportingTokens 어설션

다음과 같은 종류의 지원 토큰 어설션이 지원됩니다.

7.2.8. sp:SupportingTokens

이 요소는 지정된 유형의 토큰(또는 토큰)을 wsse:Security 헤더에 포함해야 합니다. 추가 요구 사항은 적용되지 않습니다.

주의

이 정책은 토큰의 서명 또는 암호화가 명시적으로 필요하지 않습니다. 그러나 일반적으로 서명 및 암호화를 통해 토큰을 보호하는 것이 중요합니다.

7.2.9. sp:SignedSupportingTokens

이 요소는 지정된 유형의 토큰(또는 토큰)을 wsse:Security 헤더에 포함해야 합니다. 또한 이 정책을 사용하려면 토큰 무결성을 보장하기 위해 토큰에 서명해야 합니다.

주의

이 정책은 토큰을 명시적으로 암호화할 필요가 없습니다. 그러나 일반적으로 서명 및 암호화를 통해 토큰을 보호하는 것이 중요합니다.

7.2.10. sp:EncryptedSupportingTokens

이 요소는 지정된 유형의 토큰(또는 토큰)을 wsse:Security 헤더에 포함해야 합니다. 또한 이 정책은 토큰 기밀성을 보장하기 위해 토큰을 암호화해야 합니다.

주의

이 정책에는 토큰에 서명할 필요가 명시적으로 필요하지 않습니다. 그러나 일반적으로 서명 및 암호화를 통해 토큰을 보호하는 것이 중요합니다.

7.2.11. sp:SignedEncryptedSupportingTokens

이 요소는 지정된 유형의 토큰(또는 토큰)을 wsse:Security 헤더에 포함해야 합니다. 또한 이 정책은 토큰 무결성과 기밀성을 보장하기 위해 토큰을 서명하고 암호화해야 합니다.

7.2.12. sp:EndorsingSupportingTokens

토큰 지원 승인은 메시지 서명에 서명하는 데 사용됩니다(기본 서명). 이 서명을 종료 서명 또는 보조 서명 이라고 합니다. 따라서 지원 토큰 정책을 적용하면 메시지 자체에 서명하는 기본 서명과 기본 서명에 서명하는 보조 서명이라는 서명 체인이 있을 수 있습니다.

참고

전송 바인딩(예: HTTPS)을 사용하는 경우 메시지 서명은 실제로 Cryostat 메시지의 일부가 아니므로 이 경우 메시지 서명에 서명할 수 없습니다. 전송 바인딩을 사용하여 이 정책을 지정하면 종료 토큰은 대신 타임스탬프에 서명합니다.

주의

이 정책은 토큰의 서명 또는 암호화가 명시적으로 필요하지 않습니다. 그러나 일반적으로 서명 및 암호화를 통해 토큰을 보호하는 것이 중요합니다.

7.2.13. sp:SignedEndorsingSupportingTokens

이 정책은 토큰 무결성을 보장하기 위해 토큰에 서명해야 한다는 점을 제외하고 토큰을 지원하는 승인 정책과 동일합니다.

주의

이 정책은 토큰을 명시적으로 암호화할 필요가 없습니다. 그러나 일반적으로 서명 및 암호화를 통해 토큰을 보호하는 것이 중요합니다.

7.2.14. sp:EndorsingEncryptedSupportingTokens

이 정책은 토큰 기밀성을 보장하기 위해 토큰을 암호화해야 한다는 점을 제외하고 토큰을 지원하는 승인 정책과 동일합니다.

주의

이 정책에는 토큰에 서명할 필요가 명시적으로 필요하지 않습니다. 그러나 일반적으로 서명 및 암호화를 통해 토큰을 보호하는 것이 중요합니다.

7.2.15. sp:SignedEndorsingEncryptedSupportingTokens

이 정책은 토큰 무결성과 기밀성을 보장하기 위해 토큰 서명 및 암호화가 필요하다는 점을 제외하고 토큰 지원 정책 승인과 동일합니다.

7.3. 클라이언트 인증 정보 제공

7.3.1. 개요

기본적으로 UsernameToken 클라이언트 자격 증명을 제공하는 두 가지 방법이 있습니다. 클라이언트의 블루프린트 XML 구성에서 사용자 이름과 암호를 직접 설정하거나 클라이언트 구성에서 사용자 이름을 설정하고 콜백 핸들러를 구현하여 암호를 프로그래밍 방식으로 제공할 수 있습니다. 후자의 접근 방식은 (프로그래밍에 의한) 암호는 보기에서 더 쉽게 숨길 수 있다는 장점이 있습니다.

7.3.2. 클라이언트 인증 정보 속성

표 7.1. “클라이언트 인증 정보 속성” 블루프린트 XML에서 클라이언트의 요청 컨텍스트에 대한 WS-Security 사용자 이름/암호 자격 증명을 지정하는 데 사용할 수 있는 속성이 표시됩니다.

표 7.1. 클라이언트 인증 정보 속성

속성설명

security.username

UsernameToken 정책 어설션의 사용자 이름을 지정합니다.

security.password

UsernameToken 정책 어설션의 암호를 지정합니다. 지정하지 않으면 콜백 처리기를 호출하여 암호를 가져옵니다.

security.callback-handler

UsernameToken 정책 어설션의 암호를 검색하는 WSS4J 콜백 처리기의 클래스 이름을 지정합니다. 콜백 처리기는 다른 종류의 보안 이벤트도 처리할 수 있습니다.

7.3.3. 블루프린트 XML에서 클라이언트 인증 정보 구성

블루프린트 XML에서 클라이언트의 요청 컨텍스트에서 사용자 이름/암호 자격 증명을 구성하려면 다음과 같이 security.usernamesecurity.password 속성을 설정합니다.

<beans ... >
    <jaxws:client name="{NamespaceName}LocalPortName"
                  createdFromAPI="true">
        <jaxws:properties>
            <entry key="security.username" value="Alice"/>
            <entry key="security.password" value="abcd!1234"/>
        </jaxws:properties>
    </jaxws:client>
    ...
</beans>

암호를 블루프린트 XML(보안 위험일 수 있음)에 직접 저장하지 않으려면 대신 콜백 처리기를 사용하여 암호를 제공할 수 있습니다.

7.3.4. 암호를 위한 콜백 처리기 프로그래밍

콜백 처리기를 사용하여 UsernameToken 헤더에 대한 암호를 제공하려면 먼저 블루프린트 XML의 클라이언트 구성을 수정하여 security.password 설정을 security.callback-handler 설정으로 교체해야 합니다.

<beans ... >
    <jaxws:client name="{NamespaceName}LocalPortName"
                  createdFromAPI="true">
        <jaxws:properties>
            <entry key="security.username" value="Alice"/>
            <entry key="security.callback-handler" value="interop.client.UTPasswordCallback"/>
        </jaxws:properties>
    </jaxws:client>
    ...
</beans>

앞의 예에서 콜백 처리기는 UTPasswordCallback 클래스에 의해 구현됩니다. 예 7.2. “UsernameToken 암호에 대한 콜백 처리기” 에 표시된 대로 javax.security.auth.callback.CallbackHandler 인터페이스를 구현하여 콜백 처리기를 작성할 수 있습니다.

예 7.2. UsernameToken 암호에 대한 콜백 처리기

package interop.client;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;

import org.apache.ws.security.WSPasswordCallback;

public class UTPasswordCallback implements CallbackHandler {

    private Map<String, String> passwords =
        new HashMap<String, String>();

    public UTPasswordCallback() {
        passwords.put("Alice", "ecilA");
        passwords.put("Frank", "invalid-password");
        //for MS clients
        passwords.put("abcd", "dcba");
    }

    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
        for (int i = 0; i < callbacks.length; i++) {
            WSPasswordCallback pc = (WSPasswordCallback)callbacks[i];

            String pass = passwords.get(pc.getIdentifier());
            if (pass != null) {
                pc.setPassword(pass);
                return;
            }
        }

        throw new IOException();
    }

    // Add an alias/password pair to the callback mechanism.
    public void setAliasPassword(String alias, String password) {
        passwords.put(alias, password);
    }
}

콜백 기능은 CallbackHandler.handle() 메서드로 구현됩니다. 이 예제에서는 handle() 메서드로 전달된 콜백 오브젝트가 모두 org.apache.ws.security.WSPasswordCallback 유형이라고 가정합니다(더 직관적인 예에서 콜백 오브젝트 유형을 확인합니다).

클라이언트 콜백 처리기의 보다 비현실적인 구현은 사용자에게 암호를 입력하라는 메시지를 표시하는 것으로 구성될 수 있습니다.

7.3.5. WSPasswordCallback 클래스

UsernameToken 암호를 설정하기 위해 Apache CXF 클라이언트에서 콜백 처리기 를 호출하면 해당 WSPasswordCallback 오브젝트에 USERNAME_TOKEN 사용 코드가 있습니다.

WSPasswordCallback 클래스에 대한 자세한 내용은 org.apache.ws.security.WSPasswordCallback 을 참조하십시오.

WSPasswordCallback 클래스는 다음과 같이 여러 가지 사용 코드를 정의합니다.

USERNAME_TOKEN

UsernameToken 자격 증명의 암호를 가져옵니다. 이 사용 코드는 클라이언트 측과(서버로 전송할 암호를 얻기 위해) 및 서버 측에서 사용됩니다(클라이언트로부터 수신된 암호와 비교하기 위해 암호를 받기 위해).

서버 측에서 이 코드는 다음과 같은 경우에 설정됩니다.

  • 다이제스트 암호- UsernameToken에 다이제스트 암호가 포함된 경우 콜백은 지정된 사용자 이름( WSPasswordCallback.getIdentifier())에 대한 해당 암호를 반환해야 합니다. 암호 확인( 다이제스트 암호와 비교하여)은 WSS4J 런타임을 통해 수행됩니다.
  • 일반 텍스트 암호- 다이제스트 암호 케이스 (Apache CXF 2.4.0)와 동일한 방식으로 구현되었습니다.
  • 사용자 정의 암호 유형-if getHandleCustomPasswordTypes()org.apache.ws.security.WSSConfig 에서 true 인 경우 다이제스트 암호 케이스와 동일한 방식으로 구현됩니다(Apache CXF 2.4.0). 그렇지 않으면 예외가 발생합니다.

    서버 측의 수신된 UsernameToken에 Password 요소가 포함되어 있지 않은 경우 콜백 처리기는 호출되지 않습니다(Apache CXF 2.4.0).

암호 해독
Java 키 저장소에서 개인 키를 검색하려면 암호가 필요합니다. 여기서 WSPasswordCallback.getIdentifier() 는 키 저장소 항목의 별칭을 제공합니다. WSS4J는 이 개인 키를 사용하여 세션(symmetric) 키의 암호를 해독합니다.
서명
Java 키 저장소에서 개인 키를 검색하려면 암호가 필요합니다. 여기서 WSPasswordCallback.getIdentifier() 는 키 저장소 항목의 별칭을 제공합니다. WSS4J는 이 개인 키를 사용하여 서명을 생성합니다.
SECRET_KEY
아웃바운드 측에서 암호화 또는 서명에 대한 비밀 키 또는 인바운드 측의 암호 해독 또는 확인이 필요합니다. 콜백 처리기는 setKey(byte[]) 메서드를 사용하여 키를 설정해야 합니다.
SECURITY_CONTEXT_TOKEN
setKey(byte[]) 메서드를 호출하여 제공하는 wsc:SecurityContextToken 의 키가 필요합니다.
CUSTOM_TOKEN
token을 보유해야 하는 요소(element)입니다. 예를 들어 메시지에 없는 SAML Assertion 또는 SecurityContextToken에 대한 참조의 경우에 사용됩니다. 콜백 처리기는 setCustomToken( Cryostat) 메서드를 사용하여 토큰을 설정해야 합니다.
KEY_NAME
Apache CXF 2.4.0부터 이 사용 코드는 더 이상 사용되지 않습니다.
USERNAME_TOKEN_UNKNOWN
Apache CXF 2.4.0부터 이 사용 코드는 더 이상 사용되지 않습니다.
알 수 없음
WSS4J에서는 사용하지 않습니다.

7.4. 수신되는 인증 정보 인증

7.4.1. 개요

서버 측에서는 Apache CXF 런타임에 콜백 처리기를 등록하여 수신된 인증 정보가 정품인지 확인할 수 있습니다. 인증 정보 확인을 수행하기 위해 자체 사용자 지정 코드를 작성하거나 타사 엔터프라이즈 보안 시스템(예: LDAP 서버)과 통합된 콜백 핸들러를 구현할 수 있습니다.

7.4.2. 블루프린트 XML에서 서버 콜백 처리기 구성

클라이언트에서 수신된 UsernameToken 자격 증명을 확인하는 서버 콜백 처리기를 구성하려면 다음과 같이 서버의 블루프린트 XML 구성에 security.callback-handler 속성을 설정합니다.

<beans ... >
    <jaxws:endpoint
       id="UserNameOverTransport"
       address="https://localhost:9001/UserNameOverTransport"
       serviceName="interop:PingService10"
       endpointName="interop:UserNameOverTransport_IPingService"
       implementor="interop.server.UserNameOverTransport"
       depends-on="tls-settings">

       <jaxws:properties>
            <entry key="security.username" value="Alice"/>
            <entry key="security.callback-handler" value="interop.client.UTPasswordCallback"/>
        </jaxws:properties>

    </jaxws:endpoint>
    ...
</beans>

앞의 예에서 콜백 처리기는 UTPasswordCallback 클래스에 의해 구현됩니다.

7.4.3. 암호를 확인하는 콜백 처리기 구현

서버 측에서 암호를 확인하는 콜백 처리기를 구현하려면 javax.security.auth.callback.CallbackHandler 인터페이스를 구현합니다. 서버에 대한 CallbackHandler 인터페이스를 구현하는 일반적인 방법은 클라이언트에 대한 CallbackHandler 를 구현하는 것과 유사합니다. 그러나 서버 측에서 반환된 암호에 제공된 해석은 다릅니다. 그러나 콜백 처리기의 암호는 클라이언트의 자격 증명을 확인하기 위해 수신된 클라이언트 암호와 비교됩니다.

예를 들어 예 7.2. “UsernameToken 암호에 대한 콜백 처리기” 에 표시된 샘플 구현을 사용하여 서버 측에서 암호를 가져올 수 있습니다. 서버 측에서 WSS4J 런타임은 콜백에서 가져온 암호를 수신된 클라이언트 자격 증명의 암호와 비교합니다. 두 암호가 일치하면 인증 정보가 성공적으로 확인됩니다.

서버 콜백 처리기의 보다 비관적인 구현에는 보안 데이터를 저장하는 데 사용되는 타사 데이터베이스와의 통합을 작성하는 작업이 포함됩니다(예: LDAP 서버와의 통합).

8장. Fuse 인증 정보 저장소

8.1. 개요

Fuse Credential Store 기능을 사용하면 마스킹된 문자열로 암호 및 기타 민감한 문자열을 포함할 수 있습니다. 이러한 문자열은 JBoss EAP Elytron 인증 정보 저장소 에서 해결됩니다.

인증 정보 저장소는 특히 Apache Karaf 및 Java 시스템 속성에 대해 OSGI 환경을 기본적으로 지원합니다.

암호를 지정할 수 있습니다(예: javax.net.ssl.keyStorePassword )는 이 프로젝트에서 이러한 값을 인증 정보 저장소에 대한 참조로 지정할 수 있습니다.

Fuse Credential Store를 사용하면 인증 정보 저장소에 저장된 값에 대한 참조로 중요한 문자열을 지정할 수 있습니다. 일반 텍스트 값은 별칭 참조로 교체됩니다(예: 구성된 인증 정보 저장소의 별칭 아래에 저장된 값을 참조하는 CS:alias ).

CS:alias 규칙을 따라야 합니다. CS: 에서 Java System 속성 값은 접두사이며 다음 별칭 은 값을 찾는 데 사용됩니다.

8.2. 사전 요구 사항

  • Karaf 컨테이너가 실행 중입니다.

8.3. Karaf에 Fuse 인증 정보 저장소 설정

  1. credential-store:create 명령을 사용하여 인증 정보 저장소를 생성합니다.

    karaf@root()> credential-store:create -a location=credential.store -k password="my password" -k algorithm=masked-MD5-DES
    In order to use this credential store set the following environment variables
    Variable                              | Value
    ------------------------------------------------------------------------------------------------------------------------
    CREDENTIAL_STORE_PROTECTION_ALGORITHM | masked-MD5-DES
    CREDENTIAL_STORE_PROTECTION_PARAMS    | MDkEKXNvbWVhcmJpdHJhcnljcmF6eXN0cmluZ3RoYXRkb2Vzbm90bWF0dGVyAgID6AQIsUOEqvog6XI=
    CREDENTIAL_STORE_PROTECTION           | Sf6sYy7gNpygs311zcQh8Q==
    CREDENTIAL_STORE_ATTR_location        | credential.store
    Or simply use this:
    export CREDENTIAL_STORE_PROTECTION_ALGORITHM=masked-MD5-DES
    export CREDENTIAL_STORE_PROTECTION_PARAMS=MDkEKXNvbWVhcmJpdHJhcnljcmF6eXN0cmluZ3RoYXRkb2Vzbm90bWF0dGVyAgID6AQIsUOEqvog6XI=
    export CREDENTIAL_STORE_PROTECTION=Sf6sYy7gNpygs311zcQh8Q==
    export CREDENTIAL_STORE_ATTR_location=credential.store

    이는 시크릿을 저장하기 위한 JCEKS KeyStore인 credential.store 파일이 있어야 합니다.

  2. Karaf 컨테이너를 종료합니다.

    karaf@root()> logout
  3. 인증 정보 저장소를 생성할 때 표시되는 환경 변수를 설정합니다.

    $ export CREDENTIAL_STORE_PROTECTION_ALGORITHM=masked-MD5-DES
    $ export CREDENTIAL_STORE_PROTECTION_PARAMS=MDkEKXNvbWVhcmJpdHJhcnljcmF6eXN0cmluZ3RoYXRkb2Vzbm90bWF0dGVyAgID6AQIsUOEqvog6XI=
    $ export CREDENTIAL_STORE_PROTECTION=Sf6sYy7gNpygs311zcQh8Q==
    $ export CREDENTIAL_STORE_ATTR_location=credential.store
    중요

    Karaf 컨테이너를 시작하기 전에 CREDENTIAL_STORE_* 환경 변수를 설정해야 합니다.

  4. Karaf 컨테이너를 시작합니다.

    bin/karaf
  5. credential-store:store 를 사용하여 인증 정보 저장소에 보안을 추가합니다.

    karaf@root()> credential-store:store -a javax.net.ssl.keyStorePassword -s "alias is set"
    Value stored in the credential store to reference it use: CS:javax.net.ssl.keyStorePassword
  6. Karaf 컨테이너를 다시 종료합니다.

    karaf@root()> logout
  7. 값이 아닌 시크릿에 대한 참조를 다시 지정합니다.

    $ EXTRA_JAVA_OPTS="-Djavax.net.ssl.keyStorePassword=CS:javax.net.ssl.keyStorePassword" bin/karaf

System::getProperty 를 사용하여 액세스하는 경우 javax.net.ssl.keyStorePassword 값에 "alias is set" 문자열이 포함되어야 합니다.

참고

EXTRA_JAVA_OPTS 는 시스템 속성을 지정하는 여러 방법 중 하나입니다. 이러한 시스템 속성은 Karaf 컨테이너 시작 시 정의됩니다.

중요

환경 변수가 환경 외부에 유출되거나 인증 정보 저장소 파일의 콘텐츠와 함께 사용을 의도한 경우 시크릿이 손상됩니다. Cryostat를 통해 액세스하는 경우 속성 값이 "< sensitive>" 문자열로 대체되지만 System::getProperty 인 경우 System::getProperty 인 경우 인스턴스 진단 또는 모니터링 도구가 디버깅을 위해 타사 소프트웨어와 함께 액세스할 수 있는 많은 코드 경로가 있습니다.

부록 A. ASN.1 및 Distinguished Names

초록

OSI Abstract Syntax Notation One (ASN.1) 및 X.500 중단된 이름은 X.509 인증서 및 LDAP 디렉토리를 정의하는 보안 표준에서 중요한 역할을 합니다.

A.1. ASN.1

A.1.1. 개요

Abstract Syntax Notation One (ASN.1)은 초기 Cryostat의 OSI 표준 본문에 의해 정의되어 특정 머신 하드웨어 또는 프로그래밍 언어와 독립적인 데이터 유형 및 구조를 정의하는 방법을 제공합니다. 여러 가지 면에서 ASN.1은 플랫폼 독립적인 데이터 유형을 정의하는 데 관련된 OMG의 IDL 및 WSDL과 같은 최신 인터페이스 정의 언어의 포크로 간주될 수 있습니다.

ASN.1은 표준 정의(예: SNMP, X.509 및 LDAP)에 널리 사용되므로 중요합니다. 특히 ASN.1은 보안 표준 분야에서 유비쿼터스입니다. X.509 인증서 및 고유 이름의 공식 정의는 ASN.1 구문을 사용하여 설명합니다. 이러한 보안 표준을 사용하려면 ASN.1 구문에 대한 자세한 지식이 필요하지 않지만 ASN.1은 대부분의 보안 관련 데이터 유형의 기본 정의에 사용됩니다.

A.1.2. BER

OSI의 BER(Basic Encoding Rules)는 ASN.1 데이터 유형을 일련의 옥텟(이진 표현)으로 변환하는 방법을 정의합니다. 따라서 ASN.1과 관련하여 BER가 수행하는 역할은 OMG IDL과 관련하여 GIOP가 플레이한 역할과 유사합니다.

A.1.3. DER

OSI의 Distinguished Encoding Rules (DER)는 BER의 특징입니다. DER는 인코딩이 고유한지 확인하기 위한 추가 규칙(BER 인코딩이 아님)으로 구성됩니다.

A.1.4. 참고 자료

ASN.1에 대한 자세한 내용은 다음 표준 문서에서 확인할 수 있습니다.

  • ASN.1은 X.208에 정의되어 있습니다.
  • BER는 X.209에 정의되어 있습니다.

A.2. 고유 이름

A.2.1. 개요

고유 이름(DN)은 X.500 디렉터리 구조의 기본 키로 정의됩니다. 그러나 DN은 일반적인 목적 식별자로 다른 많은 컨텍스트에서 사용되었습니다. Apache CXF에서는 다음과 같은 컨텍스트에서 DN이 발생합니다.

  • X.509 인증서(예: 인증서의 DN 중 하나는 인증서 소유자(보안 주체))를 식별합니다.
  • LDAP-DN은 LDAP 디렉터리 트리에서 오브젝트를 찾는 데 사용됩니다.

A.2.2. DN의 문자열 표현

DN은 ASN.1에서 공식적으로 정의되지만 DN의 UTF-8 문자열 표현을 정의하는 LDAP 표준도 있습니다( RFC 2253참조). 문자열 표현에서는 DN 구조를 설명하기 위한 편리한 기반을 제공합니다.

참고

DN의 문자열 표현에서는 DER로 인코딩된 DN을 고유하게 표현하지 않습니다. 따라서 문자열 형식에서 DER 형식으로 다시 변환되는 DN이 항상 원래 DER 인코딩을 복구하지는 않습니다.

A.2.3. DN 문자열 예

다음 문자열은 DN의 일반적인 예입니다.

C=US,O=IONA Technologies,OU=Engineering,CN=A. N. Other

A.2.4. DN 문자열 구조

DN 문자열은 다음 기본 요소에서 빌드됩니다.

A.2.5. OID

OID(OBJECT IDENTIFIER)는 ASN.1에서 문법 구조를 고유하게 식별하는 바이트 시퀀스입니다.

A.2.6. 특성 유형

DN에 표시될 수 있는 다양한 특성 유형은 이론적으로 공개되지만 실제로는 특성 유형의 작은 하위 집합만 사용됩니다. 표 A.1. “일반적으로 사용되는 속성 유형” 발생할 가능성이 가장 큰 특성 유형을 표시합니다.

표 A.1. 일반적으로 사용되는 속성 유형

문자열 표현X.500 속성 유형데이터 크기동등한 OID

C

countryName

2

2.5.4.6

O

organizationName

1…​64

2.5.4.10

OU

organizationalUnitName

1…​64

2.5.4.11

CN

commonName

1…​64

2.5.4.3

ST

stateOrProvinceName

1…​64

2.5.4.8

L

localityName

1…​64

2.5.4.7

STREET

streetAddress

  

DC

domainComponent

  

UID

userid

  

A.2.7. AVA

특성 값 어설션 (AVA)은 특성 값을 특성 유형에 할당합니다. 문자열 표현에는 다음과 같은 구문이 있습니다.

<attr-type>=<attr-value>

예를 들면 다음과 같습니다.

CN=A. N. Other

또는 동등한 OID를 사용하여 문자열 표현에서 특성 유형을 식별할 수 있습니다( 표 A.1. “일반적으로 사용되는 속성 유형” 참조). 예를 들면 다음과 같습니다.

2.5.4.3=A. N. Other

A.2.8. RDN

상대 고유 이름 (RDN)은 DN의 단일 노드(문자열 표현에 쉼표 사이에 표시되는 비트)를 나타냅니다. 기술적으로 RDN에는 두 개 이상의 AVA가 포함될 수 있습니다(상정적으로 AVAs 세트로 정의됨). 그러나 실제로 이것은 거의 발생하지 않습니다. 문자열 표현에서 RDN에는 다음과 같은 구문이 있습니다.

<attr-type>=<attr-value>[+<attr-type>=<attr-value> ...]

다음은 다중 값 RDN의 예는 다음과 같습니다.

OU=Eng1+OU=Eng2+OU=Eng3

다음은 단일 값 RDN의 예입니다.

OU=Engineering

법적 공지

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.