|
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