5.2. 웹 서비스 프록시 보안
5.2.1. 개요
이 섹션에서는 실제 웹 서비스의 프록시 역할을 하는 Camel CXF 엔드포인트에서 SSL/TLS 보안을 활성화하는 방법을 설명합니다. 이미 X.509 인증서를 사용할 수 있다고 가정하면 필요한 모든 것은 Spring 구성 파일에 구성 데이터 블록을 추가하는 것입니다(구성 데이터가 httpj:engine-factory
요소에 포함됨). 여기에는 약간의 미묘한 측면만 있습니다. 그러나 Camel CXF 엔드포인트가 SSL/TLS 구성 세부 정보와 어떻게 연관되는지 이해해야 합니다.
5.2.2. 암시적 구성
WS 끝점은 Spring에서 끝점을 생성한 다음 해당 Cryostat 컨테이너에서 SSL/TLS 속성을 구성하여 구성할 수 있습니다. 그러나 다음과 같은 이유로 구성이 다소 혼란스러울 수 있습니다. 그러나 다음과 같은 이유로 (Suppj :engine-factory
요소에 의해 구성된 컨테이너) 는 포함된 WS 끝점을 명시적으로 참조하지 않으며 WS 끝점은 다른 컨테이너를 명시적으로 참조하지 않습니다. WS Endpoint Implicitly Configured by httpj:engine-factory 에 설명된 대로 동일한 TCP 포트를 사용하도록 구성되어 있으므로 컨테이너 컨테이너와 포함된 끝점 간의 연결이 암시적으로 설정됩니다.
WS Endpoint Implicitly Configured by httpj:engine-factory
Element
웹 서비스 엔드포인트와 httpj:engine-factory
요소 간의 연결은 다음과 같이 설정됩니다.
-
Spring 컨테이너는
httpj:engine-factory
요소가 포함된 파일을 로드하고 구문 분석합니다. -
httpj:engine-factory
8080이 생성되면 레지스트리에 해당 항목이 생성되어, metrics에 대한 참조를 저장합니다.httpj:engine-factory
Cryostat는 지정된 TCP 포트에서 수신 대기하는 container를 초기화하는 데도 사용됩니다. -
WS 끝점이 생성되면 레지스트리를 검사하여 엔드포인트 주소 URL에서 TCP 포트와 동일한 TCP 포트가 있는
httpj:engine-factory
8080을 찾을 수 있는지 확인합니다. - 빈 중 하나가 끝점의 TCP 포트와 일치하면 WS 엔드포인트가 해당 Cryostat 컨테이너에 자체적으로 설치됩니다. Cryostatty 컨테이너에 SSL/TLS가 활성화된 경우 WS 엔드포인트는 이러한 보안 설정을 공유합니다.
5.2.3. SSL/TLS 보안을 컨테이너에 추가하는 단계
SSL/TLS 보안을 컨테이너에 추가하여 WS 프록시 끝점을 보호하려면 다음 단계를 수행합니다.
5.2.4. 번들 리소스에 인증서 추가
이 데모에 사용된 인증서는 Apache CXF 3.3.6.fuse-7_13_0-00015-redhat-00001 제품의 샘플에서 가져옵니다. ( InstallDir/extras/
디렉토리에서 사용 가능) Apache CXF의 독립 실행형 버전을 설치하는 경우 CXFInstallDir/samples/wsdl_first_https/src/main/config
디렉터리에서 샘플 인증서를 찾을 수 있습니다.
CXFInstallDir/samples/wsdl_first_https/src/main/config
디렉터리의 client
디렉터리에 복사합니다. Keystore.jk
키 저장소를CamelInstallDir/example-cxf-proxy/src/main/resources/certss
5.2.5. POM을 수정하여 리소스 필터링 전환
번들에 리소스로 직접 인증서를 포함하는 것이 가장 편리한 방법입니다. 그러나 Maven 프로젝트에서 인증서를 리소스로 배포할 때 Maven 리소스 필터링을 비활성화하여 바이너리 파일이 손상됩니다.
Maven에서 .jks
파일 필터링을 비활성화하려면 텍스트 편집기를 사용하여 프로젝트 POM 파일인 CamelInstallDir/examples/camel-example-cxf-proxy/pom.xml
을 열고 다음 resources
요소를 빌드
요소의 하위로 추가합니다.
<?xml version="1.0" encoding="UTF-8"?> ... <project ...> ... <build> <plugins> ... </plugins> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <excludes> <exclude>/.jks</exclude> </excludes> </resource> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <includes> <include>/.jks</include> </includes> </resource> </resources> </build> </project>
5.2.6. CXF 버스 인스턴스화
Spring XML에서 명시적으로 CXF 버스를 인스턴스화해야 합니다(다음 단계에서 httpj:engine-factory
요소에 의해 인스턴스화되는 컨테이너는). src/main/resources/META-INF/spring
디렉토리에서 camel-config.xml
파일을 편집하여 다음과 같이 cxfcore:bus
요소를 빈
요소의 자식으로 추가합니다.
<beans ... >
...
<cxfcore:bus/>
...
</beans>
cxfcore:
네임스페이스 접두사는 이후 단계에서 정의됩니다.
5.2.7. Spring에 httpj:engine-factory 요소 추가
configuration
SSL/TLS 보안을 사용하도록 TCP 포트 9080에서 수신 대기하는 Cryostat 컨테이너를 구성하려면 예 5.2. “httpj:engine-factory Element with SSL/TLS enabled” 에 표시된 대로 src/main/resources/META-INF/spring
디렉터리에서 camel-config.xml
파일을 편집하여 httpj:engine-factory
요소를 추가합니다.
이 예에서 sec:clientAuthentication
요소의 required
속성이 false
로 설정되어 있습니다. 즉, SSL/TLS 핸드셰이크 중에 X.509 인증서를 서버에 제공할 필요가 없습니다 (이러한 인증서가 있는 경우 그렇게 할 수 있음).
예 5.2. httpj:engine-factory Element with SSL/TLS enabled
<beans ... > ... <httpj:engine-factory bus="cxf"> <httpj:engine port="${proxy.port}"> <httpj:tlsServerParameters secureSocketProtocol="TLSv1"> <sec:keyManagers keyPassword="skpass"> <sec:keyStore resource="certs/serviceKeystore.jks" password="sspass" type="JKS"/> </sec:keyManagers> <sec:trustManagers> <sec:keyStore resource="certs/serviceKeystore.jks" password="sspass" type="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="false"/> </httpj:tlsServerParameters> </httpj:engine> </httpj:engine-factory> </beans>
5.2.8. cxfcore:, sec: 및 httpj: 접두사를 정의합니다.
camel-config.xml
파일의 beans
요소에 다음 강조 표시된 행을 추가하여
요소 정의 및 cxfcore:
bus
요소의 정의에 표시되는 cxfcore: , httpj:
engine-factorysec:
namespace 접두사를 정의합니다.
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camel="http://camel.apache.org/schema/spring" xmlns:cxf="http://camel.apache.org/schema/cxf" xmlns:context="http://www.springframework.org/schema/context" xmlns:cxfcore="http://cxf.apache.org/core" xmlns:sec="http://cxf.apache.org/configuration/security" xmlns:httpj="http://cxf.apache.org/transports/http-jetty/configuration" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd http://cxf.apache.org/configuration/security http://cxf.apache.org/schemas/configuration/security.xsd http://cxf.apache.org/transports/http-jetty/configuration http://cxf.apache.org/schemas/configuration/http-jetty.xsd ">
xsi:schemaLocation
속성에서 http://cxf.apache.org/configuration/security
스키마의 위치와 http://cxf.apache.org/transports/http-jetty/configuration
스키마를 지정해야 합니다. 이는 OSGi 컨테이너에서 자동으로 제공되지 않습니다.
5.2.9. HTTPS를 사용하도록 프록시 주소 URL 수정
Apache Camel 경로 시작 시 프록시 끝점은 camel-config.xml
파일의 cxf:cxfEndpoint
요소에 의해 구성됩니다. 기본적으로 이 프록시 끝점은 HTTP 프로토콜을 사용하도록 구성되어 있습니다. 그러나 대신 보안 HTTPS 프로토콜을 사용하도록 주소 URL을 수정해야 합니다. camel-config.xml
파일에서 다음 조각에 표시된 대로 cxf:cxfEndpoint
요소의 address 속성을 편집하여 http:
접두사를 https:
접두사로 교체합니다.
<beans ...>
...
<cxf:cxfEndpoint id="reportIncident"
address="https://localhost:${proxy.port}/camel-example-cxf-proxy/webservices/incident"
endpointName="s:ReportIncidentEndpoint"
serviceName="s:ReportIncidentEndpointService"
wsdlURL="etc/report_incident.wsdl"
xmlns:s="http://reportincident.example.camel.apache.org"/>
...
</beans>
또한 주소 URL은 TCP 포트 ${proxy.port}
(기본적으로 값 9080
)를 사용하도록 구성되어 있습니다. 이 TCP 포트 값은 http:engine-factory
요소로 구성된 컨테이너의 값과 동일하므로 이 엔드포인트가 Cryostat 컨테이너에 배포되도록 합니다. cxf:cxfEndpoint
의 속성은 “자세한 내용은 WSDL 주소 지정” 에 설명된 대로 WSDL 주소 지정 세부 정보를 지정합니다.
serviceName
- WSDL 서비스 이름을 지정합니다.
endpointName
- WSDL 포트 이름을 지정합니다.
address
- 프록시 웹 서비스의 주소 URL을 지정합니다.