1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.ws.soap.security.xwss;
18
19 import java.security.cert.X509Certificate;
20 import javax.security.auth.callback.Callback;
21 import javax.security.auth.callback.CallbackHandler;
22 import javax.xml.soap.SOAPMessage;
23
24 import com.sun.xml.wss.impl.callback.CertificateValidationCallback;
25 import com.sun.xml.wss.impl.callback.SignatureKeyCallback;
26 import org.springframework.core.io.ClassPathResource;
27 import org.springframework.ws.soap.saaj.SaajSoapMessage;
28 import org.springframework.ws.soap.security.xwss.callback.AbstractCallbackHandler;
29
30 public class XwssMessageInterceptorSignTest extends XwssMessageInterceptorKeyStoreTestCase {
31
32 public void testSignDefaultCertificate() throws Exception {
33 interceptor.setPolicyConfiguration(new ClassPathResource("sign-config.xml", getClass()));
34 CallbackHandler handler = new AbstractCallbackHandler() {
35
36 protected void handleInternal(Callback callback) {
37 if (callback instanceof SignatureKeyCallback) {
38 SignatureKeyCallback keyCallback = (SignatureKeyCallback) callback;
39 if (keyCallback.getRequest() instanceof SignatureKeyCallback.DefaultPrivKeyCertRequest) {
40 SignatureKeyCallback.DefaultPrivKeyCertRequest request =
41 (SignatureKeyCallback.DefaultPrivKeyCertRequest) keyCallback.getRequest();
42 request.setX509Certificate(certificate);
43 request.setPrivateKey(privateKey);
44 }
45 else {
46 fail("Unexpected request");
47 }
48 }
49 else {
50 fail("Unexpected callback");
51 }
52 }
53 };
54 interceptor.setCallbackHandler(handler);
55 interceptor.afterPropertiesSet();
56 SaajSoapMessage message = loadSaajMessage("empty-soap.xml");
57 interceptor.secureMessage(message);
58 SOAPMessage result = message.getSaajMessage();
59 assertNotNull("No result returned", result);
60 assertXpathExists("BinarySecurityToken does not exist",
61 "SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:BinarySecurityToken", result);
62 assertXpathExists("Signature does not exist", "/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/ds:Signature",
63 result);
64 }
65
66 public void testSignAlias() throws Exception {
67 interceptor.setPolicyConfiguration(new ClassPathResource("sign-alias-config.xml", getClass()));
68 CallbackHandler handler = new AbstractCallbackHandler() {
69
70 protected void handleInternal(Callback callback) {
71 if (callback instanceof SignatureKeyCallback) {
72 SignatureKeyCallback keyCallback = (SignatureKeyCallback) callback;
73 if (keyCallback.getRequest() instanceof SignatureKeyCallback.AliasPrivKeyCertRequest) {
74 SignatureKeyCallback.AliasPrivKeyCertRequest request =
75 (SignatureKeyCallback.AliasPrivKeyCertRequest) keyCallback.getRequest();
76 assertEquals("Invalid alias", "alias", request.getAlias());
77 request.setX509Certificate(certificate);
78 request.setPrivateKey(privateKey);
79 }
80 else {
81 fail("Unexpected request");
82 }
83 }
84 else {
85 fail("Unexpected callback");
86 }
87 }
88 };
89 interceptor.setCallbackHandler(handler);
90 interceptor.afterPropertiesSet();
91 SaajSoapMessage message = loadSaajMessage("empty-soap.xml");
92 interceptor.secureMessage(message);
93 SOAPMessage result = message.getSaajMessage();
94 assertNotNull("No result returned", result);
95 assertXpathExists("BinarySecurityToken does not exist",
96 "SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:BinarySecurityToken", result);
97 assertXpathExists("Signature does not exist", "/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/ds:Signature",
98 result);
99 }
100
101 public void testValidateCertificate() throws Exception {
102 interceptor.setPolicyConfiguration(new ClassPathResource("requireSignature-config.xml", getClass()));
103 CallbackHandler handler = new AbstractCallbackHandler() {
104
105 protected void handleInternal(Callback callback) {
106 if (callback instanceof CertificateValidationCallback) {
107 CertificateValidationCallback validationCallback = (CertificateValidationCallback) callback;
108 validationCallback.setValidator(new CertificateValidationCallback.CertificateValidator() {
109 public boolean validate(X509Certificate passedCertificate) {
110 assertEquals("Invalid certificate", certificate, passedCertificate);
111 return true;
112 }
113 });
114 }
115 else {
116 fail("Unexpected callback");
117 }
118 }
119 };
120 interceptor.setCallbackHandler(handler);
121 interceptor.afterPropertiesSet();
122 SaajSoapMessage message = loadSaajMessage("signed-soap.xml");
123 interceptor.validateMessage(message);
124 SOAPMessage result = message.getSaajMessage();
125 assertNotNull("No result returned", result);
126 assertXpathNotExists("Security Header not removed", "/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security", result);
127 }
128
129 }