Расширение SAML: как перейти с алгоритма SHA-1 на SHA-2
Привет всем У меня есть проблема с расширением SAML Библиотека SAML Extension
Мне нужно переключить алгоритм подписи с SHA-1 на SHA-256, и я последовал за ответом Владимира Шефера, добавив этот фрагмент кода
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
super.postProcessBeanFactory(beanFactory);
BasicSecurityConfiguration config = (BasicSecurityConfiguration) Configuration.getGlobalSecurityConfiguration();
config.setSignatureReferenceDigestMethod(SignatureConstants.ALGO_ID_DIGEST_SHA256);
}
в мой компонент CustomSamlBoostrap, но запрос SAML, кажется, всегда подписан с SHA-1
Это код ошибки в журнале событий на сервере ADFS.
Microsoft.IdentityServer.Protocols.Saml.SamlProtocolSignatureAlgorithmMismatchException: MSIS7093: The message is not signed with expected signature algorithm. Message is signed with signature algorithm http://www.w3.org/2000/09/xmldsig#rsa-sha1. Expected signature algorithm http://www.w3.org/2001/04/xmldsig-more#rsa-sha256.
Если я проверяю запрос SAML с помощью инспектора Chrome, я вижу, что параметр SHA-1 передается в строку запроса:
...&SigAlg=http%3A%2F%2Fwww.w3.org%2F2000%2F09%2Fxmldsig%23rsa-sha1&Signature=IodfvVpOx9DAj28H4TKUc...
Я также добавил:
<property name="signingAlgorithm" value="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
в bean-объект метаданных для компонента ServiceMetadataDelegate:
<bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate">
<constructor-arg>
<bean class="org.opensaml.saml2.metadata.provider.ResourceBackedMetadataProvider">
<constructor-arg>
<bean class="java.util.Timer"/>
</constructor-arg>
<constructor-arg>
<bean class="org.opensaml.util.resource.ClasspathResource">
<constructor-arg value="/metadata/${adfs.sp.metadata.path}"/>
</bean>
</constructor-arg>
<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="false"/>
<property name="signingAlgorithm" value="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<property name="signingKey" value="mykey"/>
<property name="encryptionKey" value="mykey"/>
<property name="requireArtifactResolveSigned" value="false"/>
<property name="requireLogoutRequestSigned" value="false"/>
<property name="requireLogoutResponseSigned" value="false"/>
<property name="idpDiscoveryEnabled" value="false"/>
</bean>
</constructor-arg>
</bean>
Очевидно, я создал ключ сSHA256 с RSA как -sigalg в своем хранилище ключей.
keytool -genkey -alias mykeyname256 -keyalg RSA -sigalg SHA256withRSA -keysize 2048 -validity 3650 -keystore mykeystore.jks
Заранее спасибо.
ЧАСТИЧНО РЕШЕНО
Кажется, что один шаг решен, у меня была такая же проблема здесь /questions/27773159/ustanovka-rasshirennogo-polya-metadannyih-signaturealgorithm/27773170#27773170
и используя
config.registerSignatureAlgorithmURI("RSA", "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256");
вместо
config.setSignatureReferenceDigestMethod(SignatureConstants.ALGO_ID_DIGEST_SHA256);
заставить его работать о подписании запроса с SHA-256, но ошибка в журнале событий ADFS все еще происходит.
SAML request is not signed with expected signature algorithm. SAML request is signed with signature algorithm http://www.w3.org/2001/04/xmldsig-more#rsa-sha256 . Expected signature algorithm is http://www.w3.org/2000/09/xmldsig#rsa-sha1
Однако "Алгоритм безопасного хеширования" в настройках Доверительного участника (панель "Дополнительно") - это SHA-256, поэтому я не могу понять, почему ADFS ожидает подписи запроса с SHA-1.
Еще раз спасибо.