SAML подпись Spring Security вызвала исключение
Я использую Spring Security SAML в нашем приложении в течение некоторого времени. Теперь меня попросили добавить подпись утверждения к нашим метаданным SP. Мы сохраняем метаданные SP в БД (у нас несколько арендаторов, поэтому это был самый удобный способ). Вот действия, которые я предпринял для достижения этой цели:
Создание самозаверяющего сертификата и закрытого ключа с помощью следующей команды:
openssl req -x509 -nodes -newkey rsa:2048 -days 3650 -sha256 -keyout saml-key.key -out saml-cert.pem
Создание JKS с этим ключом и сертификатом:
cat saml-key.key saml-cert.pem | openssl pkcs12 -export -out cert.p12
keytool -importkeystore -srckeystore cert.p12 -srcstoretype pkcs12 -destkeystore myKeystore.jks
На данный момент я предполагаю, что у меня есть правильный JKS, который я собираюсь использовать в своем приложении. единственное, в чем я сомневаюсь, это псевдоним (я не устанавливал его явно, а в сертификате было установлено "Псевдоним: 1")
Метаданные SP поколения с https://www.samltool.com/sp_metadata.php Оба сертификата X.509 я заполнил значением из своего saml-cert.pem. Закрытый ключ для подписи метаданных, которые я скопировал из saml-key.key
Обновление securityContext.xml:
KeyManager:
<bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager">
<constructor-arg value="classpath:security/samlKeystore.jks"/>
<constructor-arg type="java.lang.String" value="mypassword"/>
<constructor-arg>
<map>
<entry key="myapp" value="mypassword"/>
</map>
</constructor-arg>
<constructor-arg type="java.lang.String" value="myapp"/>
</bean>
ExtendedMetadataDelegate:
<bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate">
<constructor-arg>
<bean class="com.mycompany.sso.MyResourceBackedMetadataProvider">
<constructor-arg><bean class="java.util.Timer"/></constructor-arg>
<constructor-arg ref="spMetadata" />
<property name="parserPool" ref="parserPool"/>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
<property name="local" value="true"/>
<property name="securityProfile" value="metaiop"/>
<property name="sslSecurityProfile" value="pkix"/>
<property name="sslHostnameVerification" value="default"/>
<property name="signMetadata" value="true"/>
<property name="signingKey" value="myapp"/>
<property name="encryptionKey" value="myapp"/>
<property name="tlsKey" value="myapp"/>
<property name="requireArtifactResolveSigned" value="true"/>
<property name="idpDiscoveryEnabled" value="false"/>
<property name="supportUnsolicitedResponse" value="false"/>
<property name="signingAlgorithm" value="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
</bean>
</constructor-arg>
</bean>
Проблема со всем этим заключается в следующем: Когда я запускаю свое приложение с Tomcat, я получаю следующее исключение:
Caused by: org.opensaml.saml2.metadata.provider.FilterException: Signature trust establishment failed for metadata entry
at org.opensaml.saml2.metadata.provider.SignatureValidationFilter.verifySignature(SignatureValidationFilter.java:327)
at org.opensaml.saml2.metadata.provider.SignatureValidationFilter.processEntityDescriptor(SignatureValidationFilter.java:178)
at org.opensaml.saml2.metadata.provider.SignatureValidationFilter.doFilter(SignatureValidationFilter.java:156)
at org.opensaml.saml2.metadata.provider.AbstractMetadataProvider.filterMetadata(AbstractMetadataProvider.java:493)
at org.opensaml.saml2.metadata.provider.AbstractReloadingMetadataProvider.processNonExpiredMetadata(AbstractReloadingMetadataProvider.java:398)
... 145 common frames omitted
Это исключение не появляется, если я удаляю <ds:Signature>
раздел из метаданных ИП. Поэтому я могу догадаться, что это вызывает эту проблему.
Помоги мне понять, что я сделал не так.