웹 서비스 액세스를 위해 클라이언트 인증서 인증 사용

클라이언트 애플리케이션이 웹 서비스에 액세스하도록 클라이언트 인증서를 구성할 수 있습니다.

시작하기 전에

웹 서비스 액세스에 대한 클라이언트 인증서 인증을 사용하도록 설정하기 전에 다음 전제조건을 완료해야 합니다.
  • 제공자에 대한 자체 서명 공용 및 개인용 키 쌍을 생성하십시오.
    keytool -genkey -alias default -keystore serverKey.jks -dname "CN=myServer, O=IBM, C=CN" 
        -storepass passw0rd -keypass passw0rd -storetype jks  -validity 1000 -keyalg RSA
  • 기본값의 인증서를 내보내고 인증서를 신뢰 저장소에 가져오십시오.
    keytool -export -alias default -file myserver.cer -keystore serverKey.jks
        -storepass passw0rd -storetype jks
    keytool -import -file myserver.cer -alias default -keystore clientTrust.jks 
        -storepass passw0rd -keypass passw0rd -storetype jks
  • 클라이언트에 대해 두 개의 자체 서명 공용 및 개인용 키 쌍을 생성하십시오.
    keytool -genkey -alias user0 -keystore clientKey.jks -dname "CN=employee0, O=IBM, C=CN"
        -storepass passw0rd -keypass passw0rd -storetype jks  -validity 1000 -keyalg RSA
    keytool -genkey -alias admin0 -keystore clientKey.jks -dname "CN=manager0, O=IBM, C=CN"
        -storepass passw0rd -keypass passw0rd -storetype jks  -validity 1000 -keyalg RSA
  • 두 별명의 인증서를 내보내고 인증서를 신뢰 저장소로 가져오십시오.
    keytool -export -alias user0 -file user0.cer -keystore clientKey.jks -storepass passw0rd -storetype jks
    keytool -export -alias admin0 -file admin0.cer -keystore clientKey.jks -storepass passw0rd -storetype jks
    keytool -import -file user0.cer -alias user0 -keystore serverTrust.jks -storepass passw0rd -keypass passw0rd -storetype jks
    keytool -import -file admin0.cer -alias admin0 -keystore serverTrust.jks -storepass passw0rd -keypass passw0rd -storetype jks
  • serverKey.jks, serverTrust.jks, clientKey.jksclientTrust.jks 파일을 ${server.config.dir}/resources/security 디렉토리에 복사하십시오.
참고: keytool 유틸리티는 Java™ 설치 디렉토리에 있습니다.

이 태스크 정보

클라이언트 인증서 인증으로 웹 서비스 클라이언트 애플리케이션을 사용하여 보호된 웹 서비스 자원에 액세스해야 하는 경우, 클라이언트는 요청에서 올바른 인증서를 제공하고 HTTPS를 사용하여 서비스 제공자와 통신해야 합니다.

프로시저

  1. server.xml 파일에서 jaxws-2.2, servlet-3.0(또는 servlet-3.1) 및 appSecurity-2.0 기능을 사용하도록 설정하십시오.
    <featureManager>
      <feature>jaxws-2.2</feature>
      <feature>servlet-3.0</feature>
      <feature>appSecurity-2.0</feature>
    </featureManager>
  2. server.xml 파일에서 SSL 요소와 클라이언트 사용자 정의 SSL 요소를 구성하십시오.
    <!-- Server SSL configuration -->
    <ssl id="defaultSSLConfig" keyStoreRef="serverKeyStore" trustStoreRef="serverTrustStore" 
    					ssl-ref="customizeSSLConfig"/>
    <keyStore id="serverKeyStore" location="serverKey.jks" type="JKS" password="passw0rd" /> 
    <keyStore id="serverTrustStore" location="serverTrust.jks" type="JKS" password="passw0rd" /> 
    
    <!-- customize SSL configuration -->
    <ssl id="customizeSSLConfig" keyStoreRef="clientKeyStore" trustStoreRef="clientTrustStore" /> 
    <keyStore id="clientKeyStore" location="clientKey.jks" type="JKS" password="passw0rd" /> 
    <keyStore id="clientTrustStore" location="clientTrust.jks" type="JKS" password="passw0rd" />
  3. server.xml 파일에서 로그인 영역을 구성하고 영역을 서비스 제공자에 바인드하십시오.
    <application id="TransportSecurityProvider" name="TransportSecurityProvider"
                 location="TransportSecurityProvider.war" type="ear">
            <application-bnd>
                <security-role name="Employee">
                    <user name="employee0" />
                    <group name="employeeGroup" />
                </security-role>
                <security-role name="Manager">
                    <user name="manager0" />
                </security-role>
                <security-role name="AllAuthenticated">
                    <special-subject type="ALL_AUTHENTICATED_USERS"/>
                </security-role>
            </application-bnd>
        </application>  
        
        <basicRegistry id="basic" realm="BasicRealm">
            <user name="employee0" password="emp0pwd" />
            <user name="employee1" password="emp1pwd" />
            <user name="manager0" password="mgr0pwd" />
            <group name="employeeGroup">
                <member name="employee0" />
                <member name="employee1" />
            </group>
        </basicRegistry>
  4. 서비스 제공자를 구성하십시오.
    1. 웹 서비스를 작성하십시오.
      @WebService(serviceName = "SayHelloPojoService",
                  portName = "SayHelloPojoPort")
      public class SayHelloPojoService implements SayHelloService {
      	...
      }
      
      @WebService(serviceName = "SayHelloStatelessService",
                  portName = "SayHelloStatelessPort",
                  endpointInterface = "com.ibm.ws.jaxws.transport.server.security.SayHelloService")
      @Stateless(name = "SayHelloSessionBean")
      public class SayHelloStatelessService implements SayHelloLocal {
      	...
      }
    2. 서비스 제공자에 대해 ibm-ws-bnd.xml 파일을 구성하십시오.
      <?xml version="1.0" encoding="UTF-8"?>
      <webservices-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee" 
      				xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      				xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-ws-bnd_1_0.xsd "
      		version="1.0">
      
      		<http-publishing>
      		<webservice-security>    
      			<security-constraint>
      				<web-resource-collection>
      										<web-resource-name>Only Managers</web-resource-name>
      										<url-pattern>/manager/*</url-pattern>
      					<http-method>GET</http-method>
      					<http-method>POST</http-method>
      				</web-resource-collection>
      								<auth-constraint id="AuthConstraint_manager">
      									<role-name>Manager</role-name>
      				</auth-constraint>
      				<user-data-constraint>
      					<transport-guarantee>CONFIDENTIAL</transport-guarantee>
      				</user-data-constraint>
      			</security-constraint>
      			<security-constraint>
      				<web-resource-collection>
      										<web-resource-name>Employees</web-resource-name>
      										<url-pattern>/employee/*</url-pattern>
      					<http-method>GET</http-method>
      					<http-method>POST</http-method>
      				</web-resource-collection>
      								<auth-constraint id="AuthConstraint_employee">
      					<role-name>Employee</role-name> 
      				</auth-constraint>
      				<user-data-constraint>
      					<transport-guarantee>CONFIDENTIAL</transport-guarantee>
      				</user-data-constraint>
      			</security-constraint>
      			<!-- SECURITY ROLES -->
      						<security-role id="Staff">
      				<role-name>Employee</role-name> 
      								<role-name>Manager</role-name>
      			</security-role>
      						<!-- AUTHENTICATION METHOD: client-cert authentication -->
      						<!-- login configuration -->
      						<login-config id="LoginConfig">
      								<auth-method>CLIENT-CERT</auth-method>
      								<realm-name>Authentication</realm-name>
      			</login-config> 
      		</webservice-security>
      	</http-publishing>
      </webservices-bnd>
      참고:
      • ibm-ws-bnd.xml 파일은 웹 애플리케이션의 /WEB-INF 디렉토리나 EJB 기반 웹 서비스 애플리케이션(JAR 아카이브)의 /META-INF 디렉토리에 있어야 합니다.
      • ibm-ws-bnd.xml 파일의 login-config 요소는 EJB 기반 웹 서비스 애플리케이션(JAR 아카이브)에서만 적용됩니다. 웹 애플리케이션의 경우 login-config 요소는 무시되고 web.xml 파일에 있는 동일 요소의 값이 사용됩니다.
      .
  5. 웹 서비스 엔드포인트를 지정하여 서비스 클라이언트를 구성하십시오. 예를 들어, 클라이언트 애플리케이션은 이름이 TransportSecurityClient.war인 웹 애플리케이션입니다.
    1. server.xml 파일에서 클라이언트 애플리케이션을 구성하십시오.
      <application id="TransportSecurityClient" name="TransportSecurityClient"
      				location="TransportSecurityClient.war"
      				context="TransportSecurityClient" type="war" />
    2. 클라이언트 애플리케이션에 대해 web.xml 파일을 구성하십시오.
      <?xml version="1.0" encoding="UTF-8"?>
      <webservices-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee" 
      				xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      				xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-ws-bnd_1_0.xsd "
      		version="1.0">
      		<!-- POJO service reference binding-->
      		<service-ref name="service/SayHelloPojoService">
      				<port name="SayHelloPojoPort" 
      								namespace="http://ibm.com/ws/jaxws/transport/security/"
      								ssl-ref="customizeSSLConfig"
      								key-alias="user0"/>
          <properties http.conduit.tlsClientParameters.disableCNCheck="true" />
      	</service-ref>
      		<!-- Stateless service reference binding-->
      		<service-ref name="service/SayHelloStatelessService">
      				<port name="SayHelloStatelessPort" 
      								namespace="http://ibm.com/ws/jaxws/transport/security/"
      								ssl-ref="customizeSSLConfig"
      								key-alias="user0"/>
          <properties http.conduit.tlsClientParameters.disableCNCheck="true" />
      	</service-ref>
      </webservices-bnd>
      참고:
      • ibm-ws-bnd.xml 파일은 클라이언트 웹 애플리케이션의 /WEB-INF 디렉토리에 있어야 합니다.
      • key-alias 속성은 server.xml 파일에서 정의되는 클라이언트 키 저장소에서 올바른 클라이언트 인증서를 지정합니다. 이 예에서, 클라이언트 키 저장소는 다음과 같이 정의됩니다.
        <keyStore id="clientKeyStore" location="clientKey.jks" type="JKS" password="passw0rd" />
      • ibm-ws-bnd.xml 파일의 ssl-ref 속성은 server.xml 파일에 있는 ssl 요소의 올바른 id 속성과 일치하여야 합니다. 이 예에서, ssl 요소는 다음과 같이 정의됩니다.
        <ssl id="customizeSSLConfig" keyStoreRef="clientKeyStore" trustStoreRef="clientTrustStore" />
      • 또한 key-alias 속성의 값은 또한 server.xml 파일에 있는 ssl 요소의 clientKeyAlias 속성의 값보다 우선합니다.
    3. WSDL 위치를 통해 클라이언트 스텁을 생성하십시오.
      @WebServiceClient(name = "SayHelloPojoService",
          targetNamespace = "http://ibm.com/ws/jaxws/transport/security/",
          wsdlLocation = "https://localhost:8020/TransportSecurityProvider/unauthorized/employPojoService?wsdl")
      public class SayHelloPojoService
                      extends Service
      {...}
      
      @WebServiceClient(name = "SayHelloStatelessService",
          targetNamespace = "http://ibm.com/ws/jaxws/transport/security/",
          wsdlLocation = "https://localhost:8020/TransportSecurityProvider/unauthorized/EmployStatelessService?wsdl")
      public class SayHelloStatelessService
                      extends Service
      {...}
    4. 웹 서비스를 서블릿에 삽입하기 위해 @WebServiceRef 어노테이션을 사용하십시오(예: TestJaxWsTransportSecurityServlet).
      @WebServiceRef(name = "service/SayHelloPojoService")
      SayHelloPojoService pojoService;
      
      @WebServiceRef(name = "service/SayHelloStatelessService")
      SayHelloStatelessService statelessService;

주제의 유형을 표시하는 아이콘 태스크 주제



시간소인 아이콘 마지막 업데이트 날짜: Monday, 5 December 2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-libcore-mp&topic=twlp_sec_ws_clientcert
파일 이름: twlp_sec_ws_clientcert.html