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>