Spring SAML 示例:不支持 SSOCircle SHA256

Posted

技术标签:

【中文标题】Spring SAML 示例:不支持 SSOCircle SHA256【英文标题】:Spring SAML Sample: SSOCircle SHA256 not supported 【发布时间】:2016-12-04 05:58:37 【问题描述】:

我正在尝试使用 SSOCircle 和默认密钥库的 Spring SAML 示例项目。 将 SP 元数据导入 SSOCircle 后,SSO 工作正常。

现在,我想将加密算法从 SHA-1 更改为 RSA SHA-256。 所以我扩展了 SAMLBootstrap 类,如下所示:

public final class CustomSAMLBootstrap extends SAMLBootstrap   

  @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException 
        super.postProcessBeanFactory(beanFactory);
        BasicSecurityConfiguration config = (BasicSecurityConfiguration) Configuration.getGlobalSecurityConfiguration();
        config.registerSignatureAlgorithmURI("RSA", SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA256);
        config.setSignatureReferenceDigestMethod(SignatureConstants.ALGO_ID_DIGEST_SHA256);
    

这里还有扩展元数据配置

   <!-- Extended metadata properties -->
<bean id="extendedMetadataSP" class="org.springframework.security.saml.metadata.ExtendedMetadata">
    <property name="local" value="true"/>
    <property name="securityProfile" value="metaiop"/>
    <property name="sslSecurityProfile" value="pkix"/>
    <property name="signingKey" value="apollo"/>
    <property name="encryptionKey" value="apollo"/>
    <property name="signMetadata" value="true" />
    <property name="signingAlgorithm" value="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
    <property name="idpDiscoveryEnabled" value="true"/>
    <property name="idpDiscoveryURL" value="$entityBaseURL/saml/discovery"/>
    <property name="idpDiscoveryResponseURL" value="$entityBaseURL/saml/login?disco=true"/>

</bean>

所以我通过org.springframework.security.saml.metadata.MetadataGenerator bean 重新生成了元数据并尝试重新上传新生成的 SP xml。虽然 SSOCircle 将失败并显示 007 错误代码。

此时我不确定是否需要为我完成附加步骤才能在 SSOCircle 上使用 sha256?

有人可以帮忙吗?

编辑:

将元数据上传到 SSOCircle 时遇到的问题我认为它与 EntityDescriptor 部分有关,其中签名算法指定为 SHA256,如下所示:

 <?xml version="1.0"?>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<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_com_apakgroup_bristol">
        <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>mAT5iN6IWyTCQiPplFmOq4vu8SUzCBfpAC4XBOu2+eM=</ds:DigestValue>
    </ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>i6hH............bA==</ds:SignatureValue>
<ds:KeyInfo>
    <ds:X509Data>
        <ds:X509Certificate>MIIDZTCCA............eVdvh</ds:X509Certificate>
    </ds:X509Data>
</ds:KeyInfo>
</ds:Signature>

将 signMetadata 更改为 false,不幸的是它没有任何区别。

<property name="signMetadata" value="false" />

SAML 响应:

2016-09-13 15:03:06,786 DEBUG org.opensaml.xml.security.SigningUtil:115 - Computing signature over input using private key of type RSA and JCA algorithm ID SHA256withRSA
2016-09-13 15:03:06,802 DEBUG org.opensaml.xml.security.SigningUtil:123 - Computed signature: 8b4...dfa9
2016-09-13 15:03:06,802 DEBUG opensaml.saml2.binding.encoding.HTTPRedirectDeflateEncoder:251 - Generated digital signature value (base64-encoded) i0...==
2016-09-13 15:03:06,803 DEBUG PROTOCOL_MESSAGE:74 - 
<?xml version="1.0" encoding="UTF-8"?><saml2p:AuthnRequest xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" AssertionConsumerServiceURL="http://localhost:8080/saml/SSO" Destination="https://idp.ssocircle.com:443/sso/SSORedirect/metaAlias/publicidp" ForceAuthn="false" ID="ac8eeg2j9d932hh4fe90fa71844e00" IsPassive="false" IssueInstant="2016-09-13T14:03:06.775Z" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Version="2.0">
   <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">...[my-sp]...</saml2:Issuer>
</saml2p:AuthnRequest>

2016-09-13 15:03:06,803 DEBUG opensaml.ws.message.encoder.BaseMessageEncoder:56 - Successfully encoded message.
2016-09-13 15:03:06,804 DEBUG springframework.security.saml.storage.HttpSessionStorage:93 - Storing message ac8eeg2j9d932hh4fe90fa71844e00 to session C17D8A94DED2F79BDD92CBF7A99462C6
2016-09-13 15:03:06,805  INFO springframework.security.saml.log.SAMLDefaultLogger:127 - AuthNRequest;SUCCESS;0:0:0:0:0:0:0:1;...[my-sp]...;https://idp.ssocircle.com;;;

【问题讨论】:

能否提供导致错误的示例请求以及上述调试跟踪? 我已经使用 SHA256 创建了密钥库,并且成功了。您可能在其他地方遇到问题。 【参考方案1】:

error7 的原因是无法验证元数据的签名。这在:how-to section“签名的元数据可能会导致验证问题。我们建议删除签名作为最快的解决方法。”

您已启用元数据签名:

<property name="signMetadata" value="true" /> 

把它变成“假”。

【讨论】:

嗨,我确实把它变成了假,没有任何区别。无论如何感谢您的帮助

以上是关于Spring SAML 示例:不支持 SSOCircle SHA256的主要内容,如果未能解决你的问题,请参考以下文章

Spring SAML 与 WSO2 身份服务器集成,无法识别 SAML 消息

Spring SAML - 支持自定义 SAML 断言

无法正确部署 Spring Security SAML 示例应用程序

如何在同一应用程序中使用 spring-sample 示例配置 Spring Security 基本身份验证和 SAML 身份验证

Spring MVC 中的 Okta SAML 2.0 实现(不是 Spring 引导)

Keycloak 和 Spring SAML:SigAlg 为空