[java-idp-testbed] 02/03: IDP-1008 - Add ability to optionally sign attribute queries
Tom Zeller
tzeller at dragonacea.biz
Thu Aug 4 20:06:06 EDT 2016
This is an automated email from the git hooks/post-receive script.
tzeller pushed a commit to branch master
in repository java-idp-testbed.
View the commit online:
http://git.shibboleth.net/view/?p=java-idp-testbed.git;a=commit;h=cdcacf54656289031945b758739dfc7a237b629c
commit cdcacf54656289031945b758739dfc7a237b629c
Author: Tom Zeller <tzeller at dragonacea.biz>
AuthorDate: Thu Aug 4 18:25:30 2016 -0500
IDP-1008 - Add ability to optionally sign attribute queries
---
src/main/java/sp/SAML2Controller.java | 40 ++++++++++++++++++++++++++++++++++-
src/main/webapp/index.html | 8 +++++++
2 files changed, 47 insertions(+), 1 deletion(-)
diff --git a/src/main/java/sp/SAML2Controller.java b/src/main/java/sp/SAML2Controller.java
index d740f3c..7d99c02 100644
--- a/src/main/java/sp/SAML2Controller.java
+++ b/src/main/java/sp/SAML2Controller.java
@@ -1,5 +1,6 @@
package sp;
+import java.io.IOException;
import java.net.MalformedURLException;
import java.security.KeyStore;
import java.security.PrivateKey;
@@ -15,8 +16,10 @@ import javax.servlet.http.HttpServletResponse;
import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
import net.shibboleth.utilities.java.support.net.URLBuilder;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
import net.shibboleth.utilities.java.support.security.SecureRandomIdentifierGenerationStrategy;
import net.shibboleth.utilities.java.support.xml.SerializeSupport;
+import net.shibboleth.utilities.java.support.xml.XMLParserException;
import org.apache.http.client.HttpClient;
import org.apache.http.conn.ssl.SSLContextBuilder;
@@ -28,6 +31,7 @@ import org.cryptacular.util.KeyPairUtil;
import org.joda.time.DateTime;
import org.opensaml.core.xml.XMLObject;
import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
+import org.opensaml.core.xml.io.MarshallingException;
import org.opensaml.messaging.context.InOutOperationContext;
import org.opensaml.messaging.context.MessageContext;
import org.opensaml.messaging.encoder.MessageEncodingException;
@@ -57,13 +61,18 @@ import org.opensaml.saml.saml2.metadata.Endpoint;
import org.opensaml.saml.saml2.metadata.SingleLogoutService;
import org.opensaml.saml.saml2.metadata.SingleSignOnService;
import org.opensaml.saml.saml2.profile.SAML2ActionTestingSupport;
+import org.opensaml.security.SecurityException;
+import org.opensaml.security.x509.BasicX509Credential;
import org.opensaml.soap.client.http.HttpSOAPClient;
import org.opensaml.soap.messaging.context.SOAP11Context;
import org.opensaml.soap.soap11.Body;
import org.opensaml.soap.soap11.Envelope;
import org.opensaml.xmlsec.SignatureSigningParameters;
import org.opensaml.xmlsec.context.SecurityParametersContext;
+import org.opensaml.xmlsec.signature.SignableXMLObject;
import org.opensaml.xmlsec.signature.support.SignatureConstants;
+import org.opensaml.xmlsec.signature.support.SignatureException;
+import org.opensaml.xmlsec.signature.support.SignatureSupport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.Resource;
@@ -566,7 +575,9 @@ public class SAML2Controller extends BaseSAMLController {
@RequestParam(value = "trustedTLSCertificatePassword", required = true) String trustedTLSCertificatePassword,
@RequestParam(value = "clientTLSCertificate", required = false) String clientTLSCertificate,
@RequestParam(value = "clientTLSPrivateKey", required = true) String clientTLSPrivateKey,
- @RequestParam(value = "clientTLSPassword", required = true) String clientTLSPassword)
+ @RequestParam(value = "clientTLSPassword", required = true) String clientTLSPassword,
+ @RequestParam(value = "clientSigningCertificate", required = false) String clientSigningCertificate,
+ @RequestParam(value = "clientSigningPrivateKey", required = false) String clientSigningPrivateKey)
throws Exception {
final Resource trustedTLSCertificateResource = applicationContext.getResource(trustedTLSCertificate);
@@ -587,6 +598,11 @@ public class SAML2Controller extends BaseSAMLController {
final AttributeQuery attributeQuery = buildSAML2AttributeQueryRequest(servletRequest, principalName);
+ // Sign if client signing certificate is present
+ if (StringSupport.trimOrNull(clientSigningCertificate) != null) {
+ sign(attributeQuery, clientSigningCertificate, clientSigningPrivateKey);
+ }
+
final Envelope envelope = buildSOAP11Envelope(attributeQuery);
if (log.isDebugEnabled()) {
@@ -695,4 +711,26 @@ public class SAML2Controller extends BaseSAMLController {
return httpClient;
}
+ public void sign(@Nonnull final SignableXMLObject signable, @Nonnull final String certificate,
+ @Nonnull final String privateKey)
+ throws SecurityException, MarshallingException, SignatureException, XMLParserException, IOException {
+
+ final Resource certificateResource = applicationContext.getResource(certificate);
+ log.debug("Signing certificate resource '{}'", certificateResource);
+
+ final Resource privateKeyResource = applicationContext.getResource(privateKey);
+ log.debug("Signing private key resource '{}'", privateKeyResource);
+
+ final X509Certificate cert = CertUtil.readCertificate(certificateResource.getInputStream());
+ final PrivateKey key = KeyPairUtil.readPrivateKey(privateKeyResource.getInputStream());
+ final BasicX509Credential cred = new BasicX509Credential(cert, key);
+
+ final SignatureSigningParameters signingParameters = new SignatureSigningParameters();
+ signingParameters.setSigningCredential(cred);
+ signingParameters.setSignatureAlgorithm(SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA256);
+ signingParameters.setSignatureCanonicalizationAlgorithm(SignatureConstants.ALGO_ID_C14N_EXCL_OMIT_COMMENTS);
+
+ SignatureSupport.signObject(signable, signingParameters);
+ }
+
}
diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html
index 0a8412d..9e90b2a 100644
--- a/src/main/webapp/index.html
+++ b/src/main/webapp/index.html
@@ -219,6 +219,14 @@
<td>clientTLSPassword</td>
<td><input id="saml2-attribute-query-clientTLSPassword" name="clientTLSPassword" value="secret" size="20" /></td>
</tr>
+ <tr>
+ <td>clientSigningCertificate</td>
+ <td><input id="saml2-attribute-query-clientSigningCertificate" name="clientSigningCertificate" value="classpath:/credentials/sp.crt" size="90" /></td>
+ </tr>
+ <tr>
+ <td>clientSigningPrivateKey</td>
+ <td><input id="saml2-attribute-query-clientSigningPrivateKey" name="clientSigningPrivateKey" value="classpath:/credentials/sp.key" size="90" /></td>
+ </tr>
</table>
<input type="submit" value="SAML2AttributeQuery">
</form>
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list