4

Ich versuche, die folgende Spezifikation zu folgen, um die Signatur der SAML-Antwort zu überprüfen: https://www.w3.org/TR/xmldsig-core/#sec-PKCS1Signatur verifizieren von SAML-Antwort

Hier ist mein Workflow: Ich habe die SAML-Antwort erhalten. Ich werde den Signaturumschlag los, ich kanonisiere ihn, ich überprüfe den Digest und dann überprüfe ich die Signatur. Ich konnte den SHA1-Verdau der transformierten SAML-Antwort erfolgreich berechnen und verifizieren. Die Überprüfung der RSA-SHA1-Signatur entgeht mir jedoch immer noch.

SAML-Antwort enthalten Signaturverfahren Algorithmus: http://www.w3.org/2000/09/xmldsig#rsa-sha1

ich diese Methode haben die Signatur zu überprüfen:

public static boolean verifySignature(String signatureType, PublicKey publicKey, byte[] contentBytes, byte[] sigBytes) { 
    try { 
     Signature sig = Signature.getInstance(signatureType); 
     sig.initVerify(publicKey); 
     sig.update(contentBytes); 
     return sig.verify(sigBytes); 
    } catch (Exception e) { 
     Logger.log(e); 
     return false; 
    } 
} 

ich etwas tun, es zu nennen:

String publicKeyStr = "MIIDNDCCAhwCCQCEk14scLMSGjANBgkqhkiG9w0BAQsFADBcMR8wHQYDVQQDDBZhdXRoLnJldHJvZmljaWVuY3kuY29tMQ4wDAYDVQQKDAVSZXRybzELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk1BMQ8wDQYDVQQHDAZCb3N0b24wHhcNMTYwMzAyMTU1NTQ4WhcNMTcwMzAyMTU1NTQ4WjBcMR8wHQYDVQQDDBZhdXRoLnJldHJvZmljaWVuY3kuY29tMQ4wDAYDVQQKDAVSZXRybzELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk1BMQ8wDQYDVQQHDAZCb3N0b24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDwUlZ+qOA61kYh0MGHKTe4JtSL1qJVT/8/i6sWFqbAiGdV33pxSm8iBpqLNPG+fr8aZKugik8mN3y0kZEDwD+EATXGUpqT1v1R6Wr4rRUwsC0wl6d6EiWfdSsu66T11hdrugXF/psjyy4mmvIMMU4RlSaZmT2+gpe57IWPO522Y1HqbuvSvKJgjdyrlhIKLmw7HvZ1ZrQ1j01Hd3/rdK41+zWpSCLuSellHowiDmOzNnyFpTw+SZA0GKE+cm3BOTj/cM36GR2XJd0kIRqj1qqu29cGMlBjQ3cMleG6HoHR9oPNFwYtW1fDTHG6MnxRXYCfZiPeBdX3eBDSuz7GQAv5AgMBAAEwDQYJKoZIhvcNAQELBQADggEBAEuQEPhpWdAGg46PSbE20bNt4YH+PjiIzPaXzN5UmpJjyl2kbR18HYXZHEtAXc+ItrYnK+oe+6FhwJ9aiwlrf1/p+U61iyvA9/HWzyW4vflaLWRQ8FxNhAJiVu57IQObjZ13EQfu1O8RK4wzNUVJhOz+pp9toqTHn8wmUPApzqMIl0KpDCPy1TNrwItaiy/gzWQngBMgIcrDeycR8wK2EH6txT8BzI+aqdIc3gBXsn/kS90lelbvYreXqF7VHoMs8fVEPN5fTRjqT9oZb60b1DxcniiTEknZtqprYuMpgEzpOHrzmlbCoNU2yBHuNTQWBz3lG+XtSMtgh16v5Vm48ag="; 
PublicKey publicKey = Security.getPublicKey(publicKeyStr); // uses Certificate class 
String sig = "QfAcRJM2P65JucyBpqn6j48/zd1oSLPBJ0lYI1grH5/xenwBEh0D4Eh0S1J3535OUmldpW7D+G7DW6eAT5N8TdoqUvMXuIAUpFHHDR45KZykPXJPUtli+z2rwlCCHypZWnniT/wrcQYdpp1zzNJBBtKdkaqQg0NMktPSQ/0ti+ruMI3qwfTaL9kDQ3Zyi/a2J3RCAPA0RfviLnDLlid0PthiV1NEbs0AvnguDi57fWXAILk0L1Cx20sliQckxlFQ9u4OaHeMscXdjh3SfESkM9m0Y9PppisZWTrCYzGmvDwsZTCBPD3f/ZFIit+Smgh2fi1u8/gZq0yizPyacR3Y/A=="; 
String newXMLToOperateOn = "<saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:xs="http://www.w3.org/2001/XMLSchema" ID="_420cc1a25a3890bd5df1f4c04bd7e986" ..."; 

boolean sign = Security.verifySignature("SHA1withRSA", pk, newXMLToOperateOn.getBytes(), Util.base64DecodeAsBytes(sig)); 
// SIGN IS FALSE!!!! 

newXMLToOperateOn ist die korrekte kanonisierte XML-Zeichenfolge der SAMLResponse. Dies ist, was ich verwende, um den korrekten SHA1-Digest zu generieren. Security.verify() funktioniert korrekt, da ich es für OpenID SSO-Prüfung verwende und das funktioniert.

Ich habe auch versucht, die Daten anstelle der gesamten XML zu den Bytes des SHA1 Digest zu ersetzen, aber auch nicht funktioniert. E.G. verify(algo, pk, sha1Digest.getBytes(), sig.getBytes().

Kann mir jemand sagen, ob ich bei der Überprüfung der Signatur etwas falsch gemacht habe? Die Spezifikation oben sagt mir die Unterzeichnung Methode verknüpft tut dies:

CRYPT (PAD (ASN.1 (OID, DIGEST (data)))) 

Was mir nicht eine Tonne nicht helfen, wenn ich die Unterschrift bin zu überprüfen. Ich kann die Signatur nicht neu erstellen, da ich nicht herausfinden kann, welchen privaten Schlüssel sie in ihren Beispielen verwenden.

Danke für jede Hilfe.

Antwort

2

Sie müssen nur den 'SignedInfo' Teil des XML überprüfen

+0

Das war es, danke Trogdor! – jn1kk