Skip to content

Commit 4a0daeb

Browse files
committed
Polish "Support WSS4J subject cert constraints"
See gh-1419
1 parent 8460ad8 commit 4a0daeb

File tree

2 files changed

+22
-35
lines changed

2 files changed

+22
-35
lines changed

spring-ws-security/src/main/java/org/springframework/ws/soap/security/wss4j2/Wss4jSecurityInterceptor.java

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,6 @@
6161
import org.springframework.ws.soap.security.callback.CleanupCallback;
6262
import org.springframework.ws.soap.security.wss4j2.callback.UsernameTokenPrincipalCallback;
6363

64-
import static java.util.Collections.emptyList;
65-
6664
/**
6765
* A WS-Security endpoint interceptor based on Apache's WSS4J. This interceptor supports
6866
* messages created by the
@@ -211,7 +209,7 @@ public class Wss4jSecurityInterceptor extends AbstractWsSecurityInterceptor impl
211209
// To maintain same behavior as default, this flag is set to true
212210
private boolean removeSecurityHeader = true;
213211

214-
private List<Pattern> signatureSubjectDnPatterns = emptyList();
212+
private List<Pattern> signatureSubjectDnPatterns = Collections.emptyList();
215213

216214
/**
217215
* Create a {@link WSSecurityEngine} by default.
@@ -244,15 +242,6 @@ public void setSecurementActor(String securementActor) {
244242
this.handler.setOption(WSHandlerConstants.ACTOR, securementActor);
245243
}
246244

247-
/**
248-
* Defines whether to use a single certificate or a whole certificate chain when
249-
* constructing a BinarySecurityToken used for direct reference in signature. The
250-
* default is "true", meaning that only a single certificate is used.
251-
*/
252-
public void setSecurementSignatureSingleCertificate(boolean useSingleCertificate) {
253-
handler.setOption(WSHandlerConstants.USE_SINGLE_CERTIFICATE, useSingleCertificate);
254-
}
255-
256245
public void setSecurementEncryptionCrypto(Crypto securementEncryptionCrypto) {
257246
this.handler.setSecurementEncryptionCrypto(securementEncryptionCrypto);
258247
}
@@ -545,13 +534,11 @@ public void setValidationSignatureCrypto(Crypto signatureCrypto) {
545534
* Certificate constraints which will be applied to the subject DN of the certificate
546535
* used for signature validation, after trust verification of the certificate chain
547536
* associated with the certificate.
548-
* @param patterns A list of regex patterns which will be applied to the subject DN.
549-
*
550-
* @see <a href="https://ws.apache.org/wss4j/config.html">WSS4J configuration:
551-
* SIG_SUBJECT_CERT_CONSTRAINTS</a>
537+
* @param patterns a list of regex patterns which will be applied to the subject DN.
538+
* @see ConfigurationConstants#SIG_SUBJECT_CERT_CONSTRAINTS
552539
*/
553540
public void setValidationSubjectDnConstraints(List<Pattern> patterns) {
554-
signatureSubjectDnPatterns = patterns;
541+
this.signatureSubjectDnPatterns = patterns;
555542
}
556543

557544
/**
@@ -768,7 +755,7 @@ protected RequestData initializeRequestData(MessageContext messageContext) {
768755
// allow for qualified password types for .Net interoperability
769756
requestData.setAllowNamespaceQualifiedPasswordTypes(true);
770757

771-
requestData.setSubjectCertConstraints(signatureSubjectDnPatterns);
758+
requestData.setSubjectCertConstraints(this.signatureSubjectDnPatterns);
772759
return requestData;
773760
}
774761

@@ -808,8 +795,7 @@ protected RequestData initializeValidationRequestData(MessageContext messageCont
808795
// allow for qualified password types for .Net interoperability
809796
requestData.setAllowNamespaceQualifiedPasswordTypes(true);
810797

811-
requestData.setSubjectCertConstraints(signatureSubjectDnPatterns);
812-
798+
requestData.setSubjectCertConstraints(this.signatureSubjectDnPatterns);
813799
return requestData;
814800
}
815801

spring-ws-security/src/test/java/org/springframework/ws/soap/security/wss4j2/Wss4jMessageInterceptorSignTest.java

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131

3232
import static org.assertj.core.api.Assertions.assertThat;
3333
import static org.assertj.core.api.Assertions.assertThatCode;
34-
import static org.assertj.core.api.Assertions.catchThrowable;
34+
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
3535

3636
public abstract class Wss4jMessageInterceptorSignTest extends Wss4jTest {
3737

@@ -131,31 +131,32 @@ public void testSignResponseWithSignatureUser() throws Exception {
131131
public void testValidateCertificateSubjectDnConstraintsShouldMatchSubject() throws Exception {
132132
SoapMessage message = createSignedTestSoapMessage();
133133
MessageContext messageContext = getSoap11MessageContext(createSignedTestSoapMessage());
134-
interceptor.secureMessage(message, messageContext);
134+
this.interceptor.secureMessage(message, messageContext);
135135

136-
interceptor.setValidationActions("Signature");
137-
interceptor.setValidationSubjectDnConstraints(List.of(Pattern.compile(".*")));
138-
assertThatCode(() -> interceptor.validateMessage(message, messageContext)).doesNotThrowAnyException();
136+
this.interceptor.setValidationActions("Signature");
137+
this.interceptor.setValidationSubjectDnConstraints(List.of(Pattern.compile(".*")));
138+
assertThatCode(() -> this.interceptor.validateMessage(message, messageContext)).doesNotThrowAnyException();
139139
}
140140

141141
@Test
142142
public void testValidateCertificateSubjectDnConstraintsShouldFailForNotMatchingSubject() throws Exception {
143143
SoapMessage message = createSignedTestSoapMessage();
144144
MessageContext messageContext = getSoap11MessageContext(createSignedTestSoapMessage());
145-
interceptor.secureMessage(message, messageContext);
145+
this.interceptor.secureMessage(message, messageContext);
146146

147-
interceptor.setValidationActions("Signature");
148-
interceptor.setValidationSubjectDnConstraints(List.of(Pattern.compile("O=Some Other Company")));
149-
Throwable catched = catchThrowable(() -> interceptor.validateMessage(message, messageContext));
150-
assertThat(catched).isInstanceOf(Wss4jSecurityValidationException.class);
147+
this.interceptor.setValidationActions("Signature");
148+
this.interceptor.setValidationSubjectDnConstraints(List.of(Pattern.compile("O=Some Other Company")));
149+
assertThatExceptionOfType(Wss4jSecurityValidationException.class)
150+
.isThrownBy(() -> this.interceptor.validateMessage(message, messageContext))
151+
.withMessage("The security token could not be authenticated or authorized");
151152
}
152153

153154
private SoapMessage createSignedTestSoapMessage() throws Exception {
154-
interceptor.setSecurementActions("Signature");
155-
interceptor.setSecurementSignatureKeyIdentifier("DirectReference");
156-
interceptor.setSecurementSignatureSingleCertificate(false);
157-
interceptor.setSecurementPassword("123456");
158-
interceptor.setSecurementUsername("testkey");
155+
this.interceptor.setSecurementActions("Signature");
156+
this.interceptor.setSecurementSignatureKeyIdentifier("DirectReference");
157+
this.interceptor.setUseSingleCertificate(false);
158+
this.interceptor.setSecurementPassword("123456");
159+
this.interceptor.setSecurementUsername("testkey");
159160
return loadSoap11Message("empty-soap.xml");
160161
}
161162

0 commit comments

Comments
 (0)