|
22 | 22 | import java.util.ArrayList;
|
23 | 23 | import java.util.Collections;
|
24 | 24 | import java.util.List;
|
| 25 | +import java.util.regex.Pattern; |
25 | 26 |
|
26 | 27 | import javax.security.auth.callback.Callback;
|
27 | 28 | import javax.security.auth.callback.CallbackHandler;
|
|
60 | 61 | import org.springframework.ws.soap.security.callback.CleanupCallback;
|
61 | 62 | import org.springframework.ws.soap.security.wss4j2.callback.UsernameTokenPrincipalCallback;
|
62 | 63 |
|
| 64 | +import static java.util.Collections.emptyList; |
| 65 | + |
63 | 66 | /**
|
64 | 67 | * A WS-Security endpoint interceptor based on Apache's WSS4J. This interceptor supports
|
65 | 68 | * messages created by the
|
@@ -208,6 +211,8 @@ public class Wss4jSecurityInterceptor extends AbstractWsSecurityInterceptor impl
|
208 | 211 | // To maintain same behavior as default, this flag is set to true
|
209 | 212 | private boolean removeSecurityHeader = true;
|
210 | 213 |
|
| 214 | + private List<Pattern> signatureSubjectDnPatterns = emptyList(); |
| 215 | + |
211 | 216 | /**
|
212 | 217 | * Create a {@link WSSecurityEngine} by default.
|
213 | 218 | */
|
@@ -239,6 +244,15 @@ public void setSecurementActor(String securementActor) {
|
239 | 244 | this.handler.setOption(WSHandlerConstants.ACTOR, securementActor);
|
240 | 245 | }
|
241 | 246 |
|
| 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 | + |
242 | 256 | public void setSecurementEncryptionCrypto(Crypto securementEncryptionCrypto) {
|
243 | 257 | this.handler.setSecurementEncryptionCrypto(securementEncryptionCrypto);
|
244 | 258 | }
|
@@ -527,6 +541,19 @@ public void setValidationSignatureCrypto(Crypto signatureCrypto) {
|
527 | 541 | this.validationSignatureCrypto = signatureCrypto;
|
528 | 542 | }
|
529 | 543 |
|
| 544 | + /** |
| 545 | + * Certificate constraints which will be applied to the subject DN of the certificate |
| 546 | + * used for signature validation, after trust verification of the certificate chain |
| 547 | + * 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> |
| 552 | + */ |
| 553 | + public void setValidationSubjectDnConstraints(List<Pattern> patterns) { |
| 554 | + signatureSubjectDnPatterns = patterns; |
| 555 | + } |
| 556 | + |
530 | 557 | /**
|
531 | 558 | * Whether to enable signatureConfirmation or not. By default, signatureConfirmation
|
532 | 559 | * is enabled.
|
@@ -741,6 +768,7 @@ protected RequestData initializeRequestData(MessageContext messageContext) {
|
741 | 768 | // allow for qualified password types for .Net interoperability
|
742 | 769 | requestData.setAllowNamespaceQualifiedPasswordTypes(true);
|
743 | 770 |
|
| 771 | + requestData.setSubjectCertConstraints(signatureSubjectDnPatterns); |
744 | 772 | return requestData;
|
745 | 773 | }
|
746 | 774 |
|
@@ -780,6 +808,8 @@ protected RequestData initializeValidationRequestData(MessageContext messageCont
|
780 | 808 | // allow for qualified password types for .Net interoperability
|
781 | 809 | requestData.setAllowNamespaceQualifiedPasswordTypes(true);
|
782 | 810 |
|
| 811 | + requestData.setSubjectCertConstraints(signatureSubjectDnPatterns); |
| 812 | + |
783 | 813 | return requestData;
|
784 | 814 | }
|
785 | 815 |
|
|
0 commit comments