This is an automated email from the ASF dual-hosted git repository. robertlazarski pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/axis-axis2-java-rampart.git
The following commit(s) were added to refs/heads/master by this push: new c4371bf8 RAMPART-432 Add a client and server way to set the WSS4J param disableBSPEnforcement. I need community help on a unit test, or more time to figure out one in a subsequent release c4371bf8 is described below commit c4371bf8b187086b56fd92dafa54ab15a246e067 Author: Robert Lazarski <robertlazar...@gmail.com> AuthorDate: Wed Oct 30 05:22:31 2024 -1000 RAMPART-432 Add a client and server way to set the WSS4J param disableBSPEnforcement. I need community help on a unit test, or more time to figure out one in a subsequent release --- .../src/main/java/org/apache/rampart/RampartEngine.java | 8 ++++++-- .../main/java/org/apache/rampart/RampartMessageData.java | 2 ++ .../org/apache/rampart/handler/CertificateValidator.java | 8 +++++--- .../rampart/policy/builders/RampartConfigBuilder.java | 6 ++++++ .../org/apache/rampart/policy/model/RampartConfig.java | 16 ++++++++++++++++ .../org/apache/rampart/saml/SAML1AssertionHandler.java | 5 ++--- .../org/apache/rampart/saml/SAML2AssertionHandler.java | 5 ++--- .../org/apache/rampart/saml/SAMLAssertionHandler.java | 3 ++- .../src/main/java/org/apache/rahas/RahasConstants.java | 2 ++ .../src/main/java/org/apache/rahas/client/STSClient.java | 6 +++++- .../main/java/org/apache/rahas/impl/util/CommonUtil.java | 3 ++- .../main/java/org/apache/rahas/impl/util/SAML2Utils.java | 8 ++++---- .../java/org/apache/rahas/impl/SAML2TokenIssuerTest.java | 1 - .../java/org/apache/rahas/impl/util/CommonUtilTest.java | 6 +++++- 14 files changed, 59 insertions(+), 20 deletions(-) diff --git a/modules/rampart-core/src/main/java/org/apache/rampart/RampartEngine.java b/modules/rampart-core/src/main/java/org/apache/rampart/RampartEngine.java index 2ba5b4f8..e5bee768 100644 --- a/modules/rampart-core/src/main/java/org/apache/rampart/RampartEngine.java +++ b/modules/rampart-core/src/main/java/org/apache/rampart/RampartEngine.java @@ -276,8 +276,7 @@ public class RampartEngine { Date.from(samlAssertionHandler.getDateNotBefore()), Date.from(samlAssertionHandler.getDateNotOnOrAfter())); - token.setSecret(samlAssertionHandler. - getAssertionKeyInfoSecret(signatureCrypto, tokenCallbackHandler)); + token.setSecret(samlAssertionHandler.getAssertionKeyInfoSecret(signatureCrypto, tokenCallbackHandler, Boolean.parseBoolean(rampartConfig.getDisableBSPEnforcement()))); store.add(token); } } catch (Exception e) { @@ -386,6 +385,11 @@ public class RampartEngine { requestData.setCallbackHandler(tokenCallbackHandler); requestData.setAllowRSA15KeyTransportAlgorithm(true); // backward compatibility requestData.setValidateSamlSubjectConfirmation(false); // backward compatibility + + RampartConfig rampartConfig = rpd.getRampartConfig(); + if (rampartConfig != null) { + requestData.setDisableBSPEnforcement(Boolean.parseBoolean(rampartConfig.getDisableBSPEnforcement())); // WSS4J + } //wss4j does not allow username tokens with no password per default, see https://issues.apache.org/jira/browse/WSS-420 //configure it to allow them explicitly if at least one username token assertion with no password requirement is found diff --git a/modules/rampart-core/src/main/java/org/apache/rampart/RampartMessageData.java b/modules/rampart-core/src/main/java/org/apache/rampart/RampartMessageData.java index 71cac78d..99eba6af 100644 --- a/modules/rampart-core/src/main/java/org/apache/rampart/RampartMessageData.java +++ b/modules/rampart-core/src/main/java/org/apache/rampart/RampartMessageData.java @@ -360,11 +360,13 @@ public class RampartMessageData { .getRampartConfig().isDefaultTimestampPrecisionInMs(); boolean timestampStrict = this.policyData.getRampartConfig().isTimeStampStrict(); + boolean disableBSPEnforcement = Boolean.parseBoolean(this.policyData.getRampartConfig().getDisableBSPEnforcement()); // We do not need earlier logic as now WSS4J returns a new instance of WSSConfig, rather // than a singleton instance. Therefore modifying logic as follows, requestData.setTimeStampStrict(timestampStrict); requestData.setPrecisionInMilliSeconds(timestampPrecisionInMilliseconds); + requestData.setDisableBSPEnforcement(disableBSPEnforcement); // WSS4J } diff --git a/modules/rampart-core/src/main/java/org/apache/rampart/handler/CertificateValidator.java b/modules/rampart-core/src/main/java/org/apache/rampart/handler/CertificateValidator.java index b759bf3e..60cde2ee 100644 --- a/modules/rampart-core/src/main/java/org/apache/rampart/handler/CertificateValidator.java +++ b/modules/rampart-core/src/main/java/org/apache/rampart/handler/CertificateValidator.java @@ -36,14 +36,16 @@ public class CertificateValidator extends SignatureTrustValidator { * Checks the validity of the given certificate. For more info see SignatureTrustValidator.verifyTrustInCert. * @param certificate Certificate to be validated. * @param signatureCrypto Signature crypto instance. + * @param disableBSPEnforcement Disable WSS4J feature * @return true if certificate used in signature is valid. False if it is not valid. * @throws WSSecurityException If an error occurred while trying to access Crypto and Certificate properties. */ - boolean validateCertificate(X509Certificate certificate, Crypto signatureCrypto) throws WSSecurityException { + boolean validateCertificate(X509Certificate certificate, Crypto signatureCrypto, boolean disableBSPEnforcement) throws WSSecurityException { X509Certificate[] x509certs = new X509Certificate[1]; x509certs[0] = certificate; - // [ERROR] /home/rlapache/axis-axis2-java-rampart/modules/rampart-core/src/main/java/org/apache/rampart/handler/CertificateValidator.java:[45,34] incompatible types: void cannot be converted to boolean - verifyTrustInCerts(x509certs, signatureCrypto, new RequestData(), false); + RequestData requestData = new RequestData(); + requestData.setDisableBSPEnforcement(disableBSPEnforcement); // WSS4J + verifyTrustInCerts(x509certs, signatureCrypto, requestData, false); return false; } diff --git a/modules/rampart-core/src/main/java/org/apache/rampart/policy/builders/RampartConfigBuilder.java b/modules/rampart-core/src/main/java/org/apache/rampart/policy/builders/RampartConfigBuilder.java index edce4cdb..627a684e 100644 --- a/modules/rampart-core/src/main/java/org/apache/rampart/policy/builders/RampartConfigBuilder.java +++ b/modules/rampart-core/src/main/java/org/apache/rampart/policy/builders/RampartConfigBuilder.java @@ -171,6 +171,12 @@ public class RampartConfigBuilder implements AssertionBuilder<OMElement> { rampartConfig.setTimeStampStrict(childElement.getText().trim()); } + childElement = element.getFirstChildWithName(new QName( + RampartConfig.NS, RampartConfig.DISABLE_BSP_ENFORCEMENT_LN)); + if (childElement != null) { + rampartConfig.setDisableBSPEnforcement(childElement.getText().trim()); + } + return rampartConfig; } diff --git a/modules/rampart-core/src/main/java/org/apache/rampart/policy/model/RampartConfig.java b/modules/rampart-core/src/main/java/org/apache/rampart/policy/model/RampartConfig.java index 314ed9cd..759d96cd 100644 --- a/modules/rampart-core/src/main/java/org/apache/rampart/policy/model/RampartConfig.java +++ b/modules/rampart-core/src/main/java/org/apache/rampart/policy/model/RampartConfig.java @@ -40,6 +40,7 @@ import javax.xml.stream.XMLStreamWriter; * <ramp:timestampMaxSkew>0</ramp:timestampMaxSkew> * <ramp:tokenStoreClass>org.apache.rahas.StorageImpl</ramp:tokenStoreClass> * <ramp:nonceLifeTime>org.apache.rahas.StorageImpl</ramp:nonceLifeTime> + * <ramp:disableBSPEnforcement>false</ramp:disableBSPEnforcement> * * <ramp:signatureCrypto> * <ramp:crypto provider="org.apache.ws.security.components.crypto.Merlin"> @@ -77,6 +78,8 @@ public class RampartConfig implements Assertion { public final static String RAMPART_CONFIG_LN = "RampartConfig"; public final static String USER_LN = "user"; + + public final static String DISABLE_BSP_ENFORCEMENT_LN = "disableBSPEnforcement"; public final static String USER_CERT_ALIAS_LN = "userCertAlias"; @@ -130,6 +133,8 @@ public class RampartConfig implements Assertion { private String rampartConfigCbClass; + private String disableBSPEnforcement; + private CryptoConfig sigCryptoConfig; private CryptoConfig encrCryptoConfig; @@ -277,6 +282,17 @@ public class RampartConfig implements Assertion { this.userCertAlias = userCertAlias; } + public String getDisableBSPEnforcement() { + if (disableBSPEnforcement == null) { + return "false"; + } + return disableBSPEnforcement; + } + + public void setDisableBSPEnforcement(String disableBSPEnforcement) { + this.disableBSPEnforcement = disableBSPEnforcement; + } + public QName getName() { return new QName(NS, RAMPART_CONFIG_LN); } diff --git a/modules/rampart-core/src/main/java/org/apache/rampart/saml/SAML1AssertionHandler.java b/modules/rampart-core/src/main/java/org/apache/rampart/saml/SAML1AssertionHandler.java index c07960cd..f73466c0 100644 --- a/modules/rampart-core/src/main/java/org/apache/rampart/saml/SAML1AssertionHandler.java +++ b/modules/rampart-core/src/main/java/org/apache/rampart/saml/SAML1AssertionHandler.java @@ -68,15 +68,14 @@ public class SAML1AssertionHandler extends SAMLAssertionHandler{ } @Override - public byte[] getAssertionKeyInfoSecret(Crypto signatureCrypto, TokenCallbackHandler tokenCallbackHandler) - throws WSSecurityException { + public byte[] getAssertionKeyInfoSecret(Crypto signatureCrypto, TokenCallbackHandler tokenCallbackHandler, boolean disableBSPEnforcement) throws WSSecurityException { RequestData requestData = new RequestData(); requestData.setCallbackHandler(tokenCallbackHandler); requestData.setSigVerCrypto(signatureCrypto); + requestData.setDisableBSPEnforcement(disableBSPEnforcement); // WSS4J WSDocInfo docInfo = new WSDocInfo(assertion.getDOM().getOwnerDocument()); // TODO Improve .. - // TODO change this to use SAMLAssertion parameter once wss4j conversion is done .... SAMLKeyInfo samlKi = SAMLUtil.getCredentialFromSubject(assertion, new WSSSAMLKeyInfoProcessor(requestData), signatureCrypto); return samlKi.getSecret(); diff --git a/modules/rampart-core/src/main/java/org/apache/rampart/saml/SAML2AssertionHandler.java b/modules/rampart-core/src/main/java/org/apache/rampart/saml/SAML2AssertionHandler.java index ceeaa591..948ad7aa 100644 --- a/modules/rampart-core/src/main/java/org/apache/rampart/saml/SAML2AssertionHandler.java +++ b/modules/rampart-core/src/main/java/org/apache/rampart/saml/SAML2AssertionHandler.java @@ -88,11 +88,10 @@ public class SAML2AssertionHandler extends SAMLAssertionHandler{ } - public byte[] getAssertionKeyInfoSecret(Crypto signatureCrypto, TokenCallbackHandler tokenCallbackHandler) - throws WSSecurityException { + public byte[] getAssertionKeyInfoSecret(Crypto signatureCrypto, TokenCallbackHandler tokenCallbackHandler, boolean disableBSPEnforcement) throws WSSecurityException { // TODO : SAML2KeyInfo element needs to be moved to WSS4J. SAML2KeyInfo saml2KeyInfo = SAML2Utils. - getSAML2KeyInfo(assertion, signatureCrypto, tokenCallbackHandler); + getSAML2KeyInfo(assertion, signatureCrypto, tokenCallbackHandler, disableBSPEnforcement); return saml2KeyInfo.getSecret(); } diff --git a/modules/rampart-core/src/main/java/org/apache/rampart/saml/SAMLAssertionHandler.java b/modules/rampart-core/src/main/java/org/apache/rampart/saml/SAMLAssertionHandler.java index 6d3432a7..eca67b43 100644 --- a/modules/rampart-core/src/main/java/org/apache/rampart/saml/SAMLAssertionHandler.java +++ b/modules/rampart-core/src/main/java/org/apache/rampart/saml/SAMLAssertionHandler.java @@ -77,10 +77,11 @@ public abstract class SAMLAssertionHandler { * Gets the secret in assertion. * @param signatureCrypto Signature crypto info, private,public keys. * @param tokenCallbackHandler The token callback class. TODO Why ? + * @param disableBSPEnforcement Pass the value to WSS4J when creating RequestData * @return Secret as a byte array * @throws WSSecurityException If an error occurred while validating the signature. */ - public abstract byte[] getAssertionKeyInfoSecret(Crypto signatureCrypto, TokenCallbackHandler tokenCallbackHandler) + public abstract byte[] getAssertionKeyInfoSecret(Crypto signatureCrypto, TokenCallbackHandler tokenCallbackHandler, boolean disableBSPEnforcement) throws WSSecurityException; /** diff --git a/modules/rampart-trust/src/main/java/org/apache/rahas/RahasConstants.java b/modules/rampart-trust/src/main/java/org/apache/rahas/RahasConstants.java index d9ddb994..3efead84 100644 --- a/modules/rampart-trust/src/main/java/org/apache/rahas/RahasConstants.java +++ b/modules/rampart-trust/src/main/java/org/apache/rahas/RahasConstants.java @@ -145,4 +145,6 @@ public class RahasConstants { public static final String SAML_NS = "urn:oasis:names:tc:SAML:1.0:assertion"; public static final String AUTHENTICATION_METHOD_PASSWORD = "urn:oasis:names:tc:SAML:1.0:am:password"; + // WSS4J, see RAMPART-432 + public static final String DISABLE_BSP_ENFORCEMENT = "disableBSPEnforcement"; } diff --git a/modules/rampart-trust/src/main/java/org/apache/rahas/client/STSClient.java b/modules/rampart-trust/src/main/java/org/apache/rahas/client/STSClient.java index 20303baa..84fe0a03 100644 --- a/modules/rampart-trust/src/main/java/org/apache/rahas/client/STSClient.java +++ b/modules/rampart-trust/src/main/java/org/apache/rahas/client/STSClient.java @@ -479,7 +479,11 @@ public class STSClient { child.getXMLStreamReader()).getDocumentElement(); try { - secret = CommonUtil.getDecryptedBytes(this.cbHandler, this.crypto, domChild); + boolean disableBSPEnforcement = false; + if (this.options != null && this.options.getProperty(RahasConstants.DISABLE_BSP_ENFORCEMENT) != null) { + disableBSPEnforcement = Boolean.parseBoolean((String) this.options.getProperty(RahasConstants.DISABLE_BSP_ENFORCEMENT)); + } + secret = CommonUtil.getDecryptedBytes(this.cbHandler, this.crypto, domChild, disableBSPEnforcement); } catch (WSSecurityException e) { log.error("Error decrypting encrypted key element", e); throw new TrustException("errorInProcessingEncryptedKey", e); diff --git a/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/CommonUtil.java b/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/CommonUtil.java index 73cc5535..25b4d487 100644 --- a/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/CommonUtil.java +++ b/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/CommonUtil.java @@ -151,7 +151,7 @@ public class CommonUtil { * @return The secret as a byte stream. * @throws WSSecurityException If an error is occurred while decrypting the element. */ - public static byte[] getDecryptedBytes(CallbackHandler callbackHandler, Crypto crypto, Node encryptedKeyElement) + public static byte[] getDecryptedBytes(CallbackHandler callbackHandler, Crypto crypto, Node encryptedKeyElement, boolean disableBSPEnforcement) throws WSSecurityException { EncryptedKeyProcessor encryptedKeyProcessor = new EncryptedKeyProcessor(); @@ -159,6 +159,7 @@ public class CommonUtil { RequestData requestData = new RequestData(); requestData.setCallbackHandler(callbackHandler); requestData.setDecCrypto(crypto); + requestData.setDisableBSPEnforcement(disableBSPEnforcement); final WSSConfig cfg = WSSConfig.getNewInstance(); requestData.setWssConfig(cfg); diff --git a/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SAML2Utils.java b/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SAML2Utils.java index eb65ab13..6b89f300 100644 --- a/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SAML2Utils.java +++ b/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SAML2Utils.java @@ -103,7 +103,7 @@ public class SAML2Utils { * */ public static SAML2KeyInfo getSAML2KeyInfo(Element elem, Crypto crypto, - CallbackHandler cb) throws WSSecurityException { + CallbackHandler cb, boolean disableBSPEnforcement) throws WSSecurityException { Assertion assertion; //build the assertion by unmarhalling the DOM element. @@ -139,12 +139,12 @@ public class SAML2Utils { throw new WSSecurityException( WSSecurityException.ErrorCode.FAILURE, e, "Failure in unmarshelling the assertion"); } - return getSAML2KeyInfo(assertion, crypto, cb); + return getSAML2KeyInfo(assertion, crypto, cb, disableBSPEnforcement); } public static SAML2KeyInfo getSAML2KeyInfo(Assertion assertion, Crypto crypto, - CallbackHandler cb) throws WSSecurityException { + CallbackHandler cb, boolean disableBSPEnforcement) throws WSSecurityException { //First ask the cb whether it can provide the secret WSPasswordCallback pwcb = new WSPasswordCallback(assertion.getID(), WSPasswordCallback.CUSTOM_TOKEN); @@ -232,7 +232,7 @@ public class SAML2Utils { QName el = new QName(child.getNamespaceURI(), child.getLocalName()); if (el.equals(WSConstants.ENCRYPTED_KEY)) { - byte[] secret = CommonUtil.getDecryptedBytes(cb, crypto, child); + byte[] secret = CommonUtil.getDecryptedBytes(cb, crypto, child, disableBSPEnforcement); return new SAML2KeyInfo(assertion, secret); } else if (el.equals(new QName(WSConstants.WST_NS, "BinarySecret"))) { diff --git a/modules/rampart-trust/src/test/java/org/apache/rahas/impl/SAML2TokenIssuerTest.java b/modules/rampart-trust/src/test/java/org/apache/rahas/impl/SAML2TokenIssuerTest.java index 78dab4e3..3e682f38 100644 --- a/modules/rampart-trust/src/test/java/org/apache/rahas/impl/SAML2TokenIssuerTest.java +++ b/modules/rampart-trust/src/test/java/org/apache/rahas/impl/SAML2TokenIssuerTest.java @@ -25,7 +25,6 @@ import org.apache.axis2.context.MessageContext; import org.apache.rahas.RahasConstants; import org.apache.rahas.RahasData; import org.apache.rahas.Token; -import org.apache.rahas.client.STSClient; import org.apache.rahas.test.util.AbstractTestCase; import org.apache.rahas.test.util.TestSTSClient; import org.apache.rahas.test.util.TestUtil; diff --git a/modules/rampart-trust/src/test/java/org/apache/rahas/impl/util/CommonUtilTest.java b/modules/rampart-trust/src/test/java/org/apache/rahas/impl/util/CommonUtilTest.java index 93b008b6..877f6b69 100644 --- a/modules/rampart-trust/src/test/java/org/apache/rahas/impl/util/CommonUtilTest.java +++ b/modules/rampart-trust/src/test/java/org/apache/rahas/impl/util/CommonUtilTest.java @@ -204,10 +204,14 @@ public class CommonUtilTest extends AbstractTestCase { Element element = builder.getEncryptedKeyElement(); - byte[] decryptedKey = CommonUtil.getDecryptedBytes(new TestCallbackHandler(), TestUtil.getCrypto(), element); + byte[] decryptedKey = CommonUtil.getDecryptedBytes(new TestCallbackHandler(), TestUtil.getCrypto(), element, false); Assert.assertTrue(Arrays.equals(ephemeralKey, decryptedKey)); + // FIXME - need a test case for disabling BSP compliance on WSS4J + // byte[] decryptedKey2 = CommonUtil.getDecryptedBytes(new TestCallbackHandler(), TestUtil.getCrypto(), element, true); + // Assert.assertTrue(Arrays.equals(ephemeralKey, decryptedKey2)); + } public void testGetSymmetricKeyBasedKeyInfo() throws Exception {