The signature looks a bit odd. Some of the XML Signature elements are
defined in the dsig namespace bound by a 'ds' prefix, while others don't
have a 'ds' prefix (see CanonicalizationMethod, SignatureValue and the
DigestValue elements).
When I validated the signature, the cryptographic signature itself was
invalid, so I'm wondering if the SignedInfo contents have been modified
since the signature was generated. How did you generate this signature
and why the inconsistency in namespaces?
--Sean
Ian Hummel wrote:
Hi there,
I am having some issues validating the signature on the following XML
file using both xmlsec-1.4.0 and xmlsec-1.4.1:
<saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"
AssertionID="urn:uuid:44FFFE2742C5DBB6311203096718823"
IssueInstant="2008-02-15T17:31:58.817Z"
Issuer="https://rh150.sohosmart.net/TokenService/services/Trust"
MajorVersion="1" MinorVersion="1">
<saml:Conditions NotBefore="2008-02-15T17:31:58.817Z"
NotOnOrAfter="2008-02-22T17:31:58.817Z"/>
<saml:AttributeStatement>
<saml:Subject>
<saml:SubjectConfirmation>
<saml:ConfirmationMethod>urn:oasis:names:tc:SAML:1.0:cm:bearer</saml:ConfirmationMethod>
</saml:SubjectConfirmation>
</saml:Subject>
<saml:Attribute AttributeName="privatepersonalidentifier"
AttributeNamespace="http://schemas.xmlsoap.org/ws/2005/05/identity/claims">
<saml:AttributeValue>NBkhyg1zm4UTqbpjkQg7LhXFlS8EpMpDtnphO1SvASA=</saml:AttributeValue>
</saml:Attribute>
<saml:Attribute AttributeName="emailaddress"
AttributeNamespace="http://schemas.xmlsoap.org/ws/2005/05/identity/claims">
<saml:AttributeValue>[EMAIL PROTECTED]</saml:AttributeValue>
</saml:Attribute>
</saml:AttributeStatement>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<CanonicalizationMethod
xmlns="http://www.w3.org/2000/09/xmldsig#"
Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod
Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<ds:Reference URI="#urn:uuid:44FFFE2742C5DBB6311203096718823">
<ds:Transforms>
<ds:Transform
Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform
Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transforms>
<ds:DigestMethod
Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue
xmlns="http://www.w3.org/2000/09/xmldsig#">IjaxSnB43LryrBM25gCeFFEoaMc=</DigestValue>
</ds:Reference>
</ds:SignedInfo>
<SignatureValue
xmlns="http://www.w3.org/2000/09/xmldsig#">BQadvf3/JZquVfzTGVa0OSGkmddVwMWdn30JEHTKYZvT26Goxg62iYg9xkB527dphU2bHBd2KICyo2cliivKsOxFqKpOPcIxgft/y+vv+RqE5cTn2BDsVZ6WfWWfiXHgEUAkzF+BUBoGG7mJ1Gs8ycZoIl/9pYgCzeUjSJXYNSU=</SignatureValue>
<ds:KeyInfo>
<ds:KeyValue>
<ds:RSAKeyValue>
<Modulus xmlns="http://www.w3.org/2000/09/xmldsig#">
imhZHVDvtboiubhWbcNFyIDOamOaOVWIdD6QpDq8i/D3MltwgBTDorX+/prqfj8RMWxbmYlmbuts
q9ZBHlaCz8eKdXqZQJ3bUmqDtAXU6PnAM0J4UsW/S1ikTEVgcpV6mGpjsEF8UojhcNOJkwMyDipk
xmtcY+YknWkiJ5sl+LE=
</Modulus>
<Exponent
xmlns="http://www.w3.org/2000/09/xmldsig#">AQAB</Exponent>
</ds:RSAKeyValue>
</ds:KeyValue>
</ds:KeyInfo>
</ds:Signature>
</saml:Assertion>
The code I am using to verify the signature is the following:
public static boolean verifyXmlSignature(Document doc) {
Element signatureElement = (Element)
doc.getElementsByTagNameNS(Constants.SignatureSpecNS, "Signature").item(0);
logger.debug("signatureElement? " + signatureElement);
XMLSignature signature;
try {
signature = new XMLSignature(signatureElement,
System.getProperty("java.io.tmpdir"));
} catch (XMLSecurityException e) {
logger.warn("error verifying digital signature", e);
return false;
}
SignedInfo signedInfo = signature.getSignedInfo();
logger.info("signedInfo? " + signedInfo);
signature.setFollowNestedManifests(true);
KeyInfo ki = signature.getKeyInfo();
logger.info("keyInfo is: " + ki);
PublicKey pk;
try {
pk = signature.getKeyInfo().getPublicKey();
logger.info("public key is: " + pk);
} catch (KeyResolverException e) {
logger.warn("Signature did not contain public key data", e);
return false;
}
try {
System.out.println("KEY The XML signature in file "
+
(signature.checkSignatureValue(pk)
? "valid (good)"
: "invalid !!!!! (bad)"));
} catch (XMLSignatureException e) {
logger.warn("Signature was invalid", e);
return false;
}
return true;
}
it always says the signature is invalid... I wonder if I am even setting
everything up correctly? I got most of the code above from the sample
files included in the 1.4.0 dist...
Am I missing something fundamental?
Thank you for any insight!
- ian.