WSSVerification API를 사용하여 서명 검증
구성의 정책 세트를 사용하지 않고도 WSS API(Web Services Security API)를 사용하여 SOAP 메시지를 보안 설정할 수 있습니다. 클라이언트 측 요청에 대해 이용자 바인딩 섹션의 서명 정보를 검증하려면 WSSVerification API를 사용하십시오. 검증할 알고리즘 및 SOAP 메시지의 서명 파트를 지정해야 합니다. WSSVerification API는 com.ibm.websphere.wssecurity.wssapi.verification 패키지의 파트입니다.
시작하기 전에
WSS API를 사용하거나 관리 콘솔을 사용하여 서명 정보를 검증하도록 정책 세트를 구성하십시오. SOAP 메시지를 보안 설정하려면 다음 서명 태스크를 완료해야 합니다.
- 서명 정보를 구성합니다.
- 서명에 대한 알고리즘 메소드 및 서명 검증을 선택합니다.
- 서명 정보를 검증합니다.
이 태스크 정보
WebSphere® Application Server는 기본 생성기의 서명 정보를 사용하여 메시지의 파트에 서명하고 RSA-SHA1 및 HMAC-SHA1과 같은 기존 알고리즘이 있는 XML 디지털 서명을 사용합니다.
XML 서명은 키 정보를 설명하는 많은 메소드를 정의하고 새 메소드 정의를 사용합니다. XML 서명을 사용할 때 XML 정규화(C14N)가 필요한 경우가 있습니다. 정보는 직렬화된 XML 문서 내에서 다양한 방식으로 표시 가능합니다. C14N 프로세스는 XML 정보를 정규화하는 데 사용됩니다. 정규화되는 정보는 C14N 알고리즘에 따라 달라지므로 적합한 C14N 알고리즘을 선택하십시오.
다음 테이블은 디지털 서명 보안 제한조건(무결성)이 정의되는 경우의 필수 및 선택적 바인딩을 표시합니다.
검증 파트 | 설명 |
---|---|
키워드 | 키워드를 사용하여 필수 서명 파트를 검증의 대상으로 추가합니다. 생성기 측의 요청에 대한 메시지 보호에서 여러 메시지 파트를 지정할 수 있습니다.
필수 서명 검증 파트에 다음 키워드를 사용하십시오.
|
xpath | XPath 표현식을 사용하여 검증 파트를 추가합니다. |
part | WSSVerifyPart 오브젝트를 검증 파트로 추가합니다. |
header | QName이 지정한 헤더를 검증 파트로 추가합니다. |
서명 검증 정보의 경우 특정 기본 동작이 발생합니다. WSSVerification API를 사용하는 가장 간단한 방법은 기본 동작을 사용하는 것입니다.
요약 메소드, 변환 메소드, 보안 토큰 및 필수 검증 파트에 대한 기본값은 WSS API가 정의합니다.
서명 검증 결정 | 기본 동작 |
---|---|
사용할 서명 메소드(알고리즘) | 서명 알고리즘 메소드를 설정합니다. 데이터 암호화와 서명 및 정규화 둘 다 지정할 수 있습니다. 기본 서명 메소드는 RSA SHA1입니다. WebSphere Application
Server는 다음 사전 구성된 서명 메소드를 지원합니다.
|
사용할 정규화 메소드(알고리즘) | 정규화 알고리즘 메소드를 설정합니다.
데이터 암호화와 서명 및 정규화 둘 다 지정할 수 있습니다. 기본 서명 메소드는 EXC_C14N입니다. WebSphere Application Server는
다음 사전 구성된 정규화 메소드를 지원합니다.
|
서명 확인의 필수 여부 | WSSSignature API가 서명 확인이 필수임을 지정하면
WSSVerification API는 서명 확인 값이 첨부된 서명 확인이 있는 응답 메시지를 받으면 이 메시지에서 서명 정보 값을 검증합니다. 서명 확인은
OASIS 웹 서비스 보안 버전 1.1 스펙에서 정의됩니다. 기본 서명 확인은 false입니다. |
지정할 보안 토큰(securityToken) | securityToken 오브젝트를 서명 파트로 추가합니다. WebSphere Application Server가 검증에 사용할 토큰 정보를 설정합니다. WebSphere Application Server는 다음과 같이 서명에 대해 사전 설정된 토큰을 지원합니다.
|
프로시저
결과
예
다음 예제는 WSSVerification API에 정의된 메소드를 사용하는 샘플 코드를 제공합니다.
// Get the message context
Object msgcontext = getMessageContext();
// Generate the WSSFactory instance (step: a)
WSSFactory factory = WSSFactory.getInstance();
// Generate the WSSConsumingContext instance (step: b)
WSSConsumingContext concont = factory.newWSSConsumingContext();
// Generate the certificate list
String certpath = "c:/WebSphere/AppServer/etc/ws-security/samples/intca2.cer";
// The location of the X509 certificate file
X509Certificate x509cert = null;
try {
InputStream is = new FileInputStream(certpath);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
x509cert = (X509Certificate)cf.generateCertificate(is);
} catch(FileNotFoundException e1){
throw new WSSException(e1);
} catch (CertificateException e2) {
throw new WSSException(e2);
}
Set<Object> eeCerts = new HashSet<Object>();
eeCerts.add(x509cert);
// Create the certificate store
java.util.List<CertStore> certList = new java.util.ArrayList<CertStore>();
CollectionCertStoreParameters certparam = new CollectionCertStoreParameters(eeCerts);
CertStore cert = null;
try {
cert = CertStore.getInstance("Collection", certparam, "IBMCertPath");
} catch (NoSuchProviderException e1) {
throw new WSSException(e1);
} catch (InvalidAlgorithmParameterException e2) {
throw new WSSException(e2);
} catch (NoSuchAlgorithmException e3) {
throw new WSSException (e3);
}
if(certList != null ){
certList.add(cert);
}
// Generate the callback handler
X509ConsumeCallbackHandler callbackHandler = new X509ConsumeCallbackHandler(
"dsig-receiver.ks",
"jks",
"server".toCharArray(),
certList,
java.security.Security.getProvider("IBMCertPath")
);
// Generate the WSSVerification instance (step: d)
WSSVerification ver = factory.newWSSVerification(X509Token.class, callbackHandler);
// Set the part to be verified (step: e)
// DEFAULT: WSSVerification.BODY, WSSSignature.ADDRESSING_HEADERS,
// and WSSSignature.TIMESTAMP.
// Set the part in the SOAP header to be specified by QName (step: e)
ver.addRequiredVerifyHeader(new QName("http://www.w3.org/2005/08/addressing", "MessageID"));
// Set the part to be specified by the keyword (step: e)
ver.addRequiredVerifyPart(WSSVerification.BODY);
// Set the part to be specified by WSSVerifyPart (step: e)
WSSVerifyPart verPart = factory.newWSSVerifyPart();
verPart.setRequiredVerifyPart(WSSVerification.BODY);
verPart.addAllowedDigestMethod(WSSVerifyPart.SHA256);
ver.addRequiredVerifyPart(verPart);
// Set the part specified by XPath expression (step: e)
StringBuffer sb = new StringBuffer();
sb.append("/*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/'
and local-name()='Envelope']");
sb.append("/*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/'
and local-name()='Body']");
sb.append("/*[namespace-uri()='http://xmlsoap.org/Ping'
and local-name()='Ping']");
sb.append("/*[namespace-uri()='http://xmlsoap.org/Ping'
and local-name()='Text']");
ver.addRequiredVerifyPartByXPath(sb.toString());
// Set one or more canonicalization method candidates for verification (step: f)
// DEFAULT : WSSVerification.EXC_C14N
ver.addAllowedCanonicalizationMethod(WSSVerification.C14N);
ver.addAllowedCanonicalizationMethod(WSSVerification.EXC_C14N);
// Set one or more signature method candidates for verification (step: g)
// DEFAULT : WSSVerification.RSA_SHA1
ver.addAllowedSignatureMethod(WSSVerification.HMAC_SHA1);
// Set the candidate security token to used for the verification (step: h)
X509ConsumeCallbackHandler callbackHandler2 = getCallbackHandler2();
ver.addToken(X509Token.class, callbackHandler2);
// Set the flag to require the signature confirmation (step: i)
ver.requireSignatureConfirmation();
// Add the WSSVerification to the WSSConsumingContext (step: j)
concont.add(ver);
//Validate the WS-Security header (step: k)
concont.process(msgcontext);
다음에 수행할 작업
SOAP 메시지에 대해 이 서명 및 설정 알고리즘 메소드를 검증한 후에 요약 메소드 또는 변환 메소드를 설정할 수 있습니다. 이러한 메소드를 설정하려는 경우 WSSVerifyPart API를 사용하거나 관리 콘솔을 사용하여 정책 세트를 구성하십시오.