Einstellen des ExtendedMetadata-Felds 'signingAlgorithm'

Ich habe ein Problem damit, dass die Spring SAML-Integration die richtige Metadatendatei für meinen IdP generiert. Mir wurden neue SHA256-SSL-Zertifikate ausgestellt. Ich habe alle Schritte durchlaufen, um den entsprechenden keyStore zu erstellen und meine Spring-Sicherheitskonfigurationsdatei vollständig festgelegt. Ich bin buchstäblich wie 98% des Weges dorthin, aber in der generierten Metadatendatei fehlt eine Sache, die ich für mein ganzes Leben nicht herausfinden kann, warum sie nicht festgelegt wird.

Hier ist meine ExtendedMetadata-Konfiguration für MetadataGeneratorFilter:

<bean id="metadataGeneratorFilter" class="org.springframework.security.saml.metadata.MetadataGeneratorFilter">
<constructor-arg>
    <bean class="org.springframework.security.saml.metadata.MetadataGenerator">
        <property name="entityId" value="urn:myentityidhere"/>
        <property name="entityBaseURL" value="https://${saml.url}"/>
        <property name="extendedMetadata">
            <bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
                <property name="signMetadata" value="true"/>
                <property name="signingAlgorithm" value="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
                <property name="alias" value="ceo"/>
                <property name="signingKey" value="${saml.sp.alias}"/>
                <property name="encryptionKey" value="${saml.sp.alias}"/>
            </bean>
        </property>
    </bean>
</constructor-arg>

Wenn ich meine App ausführe und zum URI / saml / metadata gehe, damit Spring die Metadatendatei generiert, die ich an meinen IdP senden muss, wird der SHA256-Algo in SignatureMethod korrekt festgelegt, aber der Algorithmuswert des untergeordneten DigestMethod-Tags bleibt bestehen auf SHA1 setzen, wenn ich das AUCH brauche, um zusammen mit dem DigestValue auf SHA256 zu setzen, damit es ein SHA256-Wert und kein SHA1-Wert ist.

<ds:SignedInfo>
    <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
    <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
    <ds:Reference URI="#urn_myentityidhere">
        <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"/>
        <ds:DigestValue>xxxxxxx</ds:DigestValue>
    </ds:Reference>
</ds:SignedInfo>

Kann mir jemand erklären, wie / was ich einstellen muss, damit der DigestMethod-Algorithmus ebenfalls auf 256 gesetzt wird? Ich dachte, da es ein Kind des SignedInfo-Tags ist, würde es den signingAlgorithm-Wert von der Extendedmetadata-Konfiguration erben, aber leider nicht.

Jede Hilfe wäre sehr dankbar. Vielen Dank

LÖSUNG - Für den Fall, dass sich jemand darum kümmert

So, nach einem Tag des Grabens, entschied ich mich, dies einfach selbst umzusetzen. Ich habe die ExtendedMetadata-Klasse um das Feld digestMethodAlgorithm erweitert und die entsprechenden Getter / Setter hinzugefügt:

/**
 * Algorithm used for creation of digest method of this entity. At the moment only used for metadata signatures.
 * Only valid for local entities.
 */
private String digestMethodAlgorithm;

/**
 * Returns digest method algorithm value
 * @return String
 */
public String getDigestMethodAlgorithm()
{
    return digestMethodAlgorithm;
}

/**
 * Sets the digest method algorithm to use when signing the SAML messages.
 * This can be used, for example, when a strong algorithm is required (e.g. SHA 256 instead of SHA 128).
 * If this property is null, then the {@link org.opensaml.xml.Configuration} default algorithm will be used instead.
 *
 * Value only applies to local entities.
 *
 * At the moment the value is only used for signatures on metadata.
 *
 * Typical values are:
 * http://www.w3.org/2001/04/xmlenc#sha1
 * http://www.w3.org/2001/04/xmlenc#sha256
 * http://www.w3.org/2001/04/xmlenc#sha384
 * http://www.w3.org/2001/04/xmlenc#sha512
 * http://www.w3.org/2001/04/xmlenc#ripemd160
 *
 * @param digestMethodAlgorithm The new digest method algorithm to use
 * @see org.opensaml.xml.signature.SignatureConstants
 */
public void setDigestMethodAlgorithm(String digestMethodAlgorithm)
{
    this.digestMethodAlgorithm = digestMethodAlgorithm;
}

Dann habe ich meine Spring-Sicherheitskonfiguration von oben geändert und diese neue Bean-Eigenschaft in meine MetadataGenerator-Konfiguration aufgenommen:

<bean id="metadataGeneratorFilter" class="org.springframework.security.saml.metadata.MetadataGeneratorFilter">
<constructor-arg>
    <bean class="org.springframework.security.saml.metadata.MetadataGenerator">
        <property name="entityId" value="urn:myentityidhere"/>
        <property name="entityBaseURL" value="https://${saml.url}"/>
        <property name="extendedMetadata">
            <bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
                <property name="signMetadata" value="true"/>
                <property name="signingAlgorithm" value="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
                <property name="digestMethodAlgorithm" value="http://www.w3.org/2001/04/xmlenc#sha256"/>
                <property name="alias" value="ceo"/>
                <property name="signingKey" value="${saml.sp.alias}"/>
                <property name="encryptionKey" value="${saml.sp.alias}"/>
            </bean>
        </property>
    </bean>
</constructor-arg>

Dann musste ich auch zwei Änderungen an der SAMLUtil-Klasse vornehmen. In getmetadataAsString habe ich in der if-Klausel von isSignMetadata () den in die obige Konfiguration eingegebenen Wert für digestMethodAlgorithm abgerufen und dann die marshallAndSignMessage-Methode so geändert, dass sie einen neuen Eingabeparameter akzeptiert, mit dem ich den DigestMethod-Algorithmus ordnungsgemäß abrufe .

Innerhalb von SAMLUtil.getMetaDataAsString, Zeile 572

...
String digestMethodAlgorithm = extendedMetadata.getDigestMethodAlgorithm();
element = SAMLUtil.marshallAndSignMessage(descriptor, credential, signingAlgorithm, digestMethodAlgorithm, keyGenerator);
...

Innerhalb von SAMLUtil.marshallAndSignMessage, direkt nach Zeile 437, habe ich Folgendes hinzugefügt / geändert:

...
BasicSecurityConfiguration secConfig = null;

if (digestMethodAlgorithm != null)
{
    secConfig = (BasicSecurityConfiguration) Configuration.getGlobalSecurityConfiguration();

    secConfig.setSignatureReferenceDigestMethod(digestMethodAlgorithm);
}

try {
    SecurityHelper.prepareSignatureParams(signature, signingCredential, secConfig, keyInfoGenerator);
} catch (org.opensaml.xml.security.SecurityException e) {
    throw new MessageEncodingException("Error preparing signature for signing", e);
}
...

Ich habe das gesamte Spring SAML-Kernpaket über Gradle, spring-security-saml-1.0.0.RELEASE, neu kompiliert, die neue JAR-Datei aus dem Verzeichnis build / libs in mein Projekt kopiert, die Webapp bereitgestellt und meinen Browser auf / saml / metadata verwiesen und hat erfolgreich die Metadatendatei mit dem korrekten SHA256-signierten Teil der Metadatendatei erhalten.

Ich werde sehen, was ich tun kann, um dies für das Git-Repo für dieses Projekt zu tun, da ich diese Fähigkeit nicht verlieren möchte, während das Projekt zukünftige Releases durchführt. Nie zuvor an einem Open-Source-Projekt wie diesem mitgewirkt.

<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<ds:Reference URI="#urn_myentityidhere">
    <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/2001/04/xmlenc#sha256"/>
    <ds:DigestValue>xxxxxx</ds:DigestValue>
</ds:Reference>

Antworten auf die Frage(3)

Ihre Antwort auf die Frage