【问题标题】:How do I create a keystore for a SP from the IdP metadata如何从 IdP 元数据为 SP 创建密钥库
【发布时间】:2019-06-10 23:11:38
【问题描述】:

我正在努力使用 IdP 设置我的 SP。他们给了我他们元数据的链接。我能够让 SAML 示例应用程序正常工作。我用 IdP 的元数据切换了示例元数据,但似乎我的签名证书有问题。

我尝试创建自己的密钥库并从 IdP 的元数据文件中导入 x509 证书数据,但我收到错误消息,指出我的签名错误。 我也尝试直接从证书文件创建一个密钥库,但我收到一个错误,提示我缺少私钥。

我没有直接从 IdP 获得任何密钥或证书文件,他们告诉我,我需要的所有数据都在元数据文件中。

这是我的 context.xml 文件中的 keyManager bean:

    <bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager">
        <constructor-arg value="file:F:/Certificates/PESTestKeystore.jks"/>
        <constructor-arg type="java.lang.String" value="changeit"/>
        <constructor-arg>
            <map>
                <entry key="dagtestkeystore" value="changeit"/>
            </map>
        </constructor-arg>
        <constructor-arg type="java.lang.String" value="dagtestkeystore"/>
    </bean>

我的元数据生成器我知道它需要 sha256。最初我没有指定并且收到错误,我正在使用 sha1,但 IdP 期待 sha256:

    <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:test:dag:dagtest"/>
                <property name="extendedMetadata">
                    <bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
                        <property name="signMetadata" value="true"/>
                        <property name="signingKey" value="dagtestkeystore"/>
                        <property name="signingAlgorithm" value="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
                    </bean>
                </property>
            </bean>
        </constructor-arg>
    </bean>

这是我收到的错误消息:

Encountered error during federation passive request. 

Additional Data 

Protocol Name: 
Saml 

Relying Party: 
urn:test:dag:dagtest 

Exception details: 
Microsoft.IdentityModel.Protocols.XmlSignature.SignatureVerificationFailedException: MSIS0038: SAML Message has wrong signature. Issuer: 'urn:test:dag:dagtest'.
   at Microsoft.IdentityServer.Protocols.Saml.Contract.SamlContractUtility.CreateSamlMessage(MSISSamlBindingMessage message)
   at Microsoft.IdentityServer.Web.Protocols.Saml.SamlProtocolManager.Issue(HttpSamlRequestMessage httpSamlRequestMessage, SecurityTokenElement onBehalfOf, String sessionState, String relayState, String& newSamlSession, String& samlpAuthenticationProvider, Boolean isUrlTranslationNeeded, WrappedHttpListenerContext context, Boolean isKmsiRequested)
   at Microsoft.IdentityServer.Web.Protocols.Saml.SamlProtocolHandler.RequestBearerToken(WrappedHttpListenerContext context, HttpSamlRequestMessage httpSamlRequest, SecurityTokenElement onBehalfOf, String relyingPartyIdentifier, Boolean isKmsiRequested, Boolean isApplicationProxyTokenRequired, String& samlpSessionState, String& samlpAuthenticationProvider)
   at Microsoft.IdentityServer.Web.Protocols.Saml.SamlProtocolHandler.BuildSignInResponseCoreWithSerializedToken(HttpSamlRequestMessage httpSamlRequest, WrappedHttpListenerContext context, String relyingPartyIdentifier, SecurityTokenElement signOnTokenElement, Boolean isKmsiRequested, Boolean isApplicationProxyTokenRequired)
   at Microsoft.IdentityServer.Web.Protocols.Saml.SamlProtocolHandler.BuildSignInResponseCoreWithSecurityToken(SamlSignInContext context, SecurityToken securityToken, SecurityToken deviceSecurityToken)
   at Microsoft.IdentityServer.Web.Protocols.Saml.SamlProtocolHandler.Process(ProtocolContext context)
   at Microsoft.IdentityServer.Web.PassiveProtocolListener.ProcessProtocolRequest(ProtocolContext protocolContext, PassiveProtocolHandler protocolHandler)
   at Microsoft.IdentityServer.Web.PassiveProtocolListener.OnGetContext(WrappedHttpListenerContext context)

【问题讨论】:

    标签: java spring-mvc saml


    【解决方案1】:

    SAML AuthnRequest 的签名是使用您的 SP 的私钥执行的。与 SAML IdP 元数据一起提供的证书中包含的公钥仅用于验证 IdP 发送的断言/SAML 响应的签名。

    【讨论】:

    • 您能否详细说明我收到的错误消息。它与签名有关,对吗?我怎么会有错误的签名?
    • 首先您需要跟踪 SAML AuthnRequest。您的 SP 可能正在使用 IdP 不接受的签名算法....对于基于 Microsoft 的 IdP(如 ADFS 或 Azure AD)尤其如此。
    【解决方案2】:

    问题:“这是我收到的错误消息:”

    Encountered error during federation passive request. 
    
    Exception details: 
    Microsoft.IdentityModel.Protocols.XmlSignature.SignatureVerificationFailedException: MSIS0038: SAML Message has wrong signature. Issuer: 'urn:test:dag:dagtest'.
    

    解决方案
    案例 1:AuthnRequest 不一定是签名的。

    案例 1 的解决方案:在 SAML2 更新 1 属性中,您可以取消选中 Sign AuthnRequest。请参考Cannot log in with SSO using SAML (Multi-SSO) & ADFS 2.0 (Error 364 & 303)

    案例 2:必须对 AuthnRequest 进行签名。

    在您的情况下,您的 SP 签署了 AuthnRequest,但 SAML IdP(即 Microsoft ADFS)未能使用您的 SP 公共证书/密钥来验证 AuthnRequest 的签名。

    案例 2 的解决方案:您需要向您的 SAML IdP(即 Microsoft ADFS)提供您的 SAML SP 元数据的 URL,以便
    Microsoft ADFS 可以下载 SAML SP 元数据,从 SP 元数据中提取 SP 公共证书/密钥,然后使用 SP 公共证书/密钥来验证签名的 AuthnRequest。

    子问题 “我正在使用 IdP 设置我的 SP。他们给了我指向其元数据的链接。我能够让 SAML 示例应用程序正常工作。我切换了示例元数据与我的 IdP 的元数据,但似乎我的签名证书有问题。”

    回答
    SAML 示例应用程序正常工作,因为他们已将 SAML 示例应用程序的 SAML SP 元数据文件上传到其 SAML IdP。

    下面列出了使用 SAML IdP 配置 SAML SP 的两种典型方法,具体取决于 SAML IdP 的不同要求。

    (1) 您需要为自己的 SP 应用程序创建 SAML SP 私钥和公共证书/密钥,生成您的 SAML SP 元数据文件(仅包含公共证书/密钥),那么您有两种选择

    (选项 I)将 SP 元数据文件上传到 SAML IdP。

    (方案二)提供SP元数据文件的URL,SAML IdP(如Microsoft ADFS)可以从该URL下载SP元数据文件。

    (2) 部分 SAML IdP 要求管理员手动上传 SAML SP 公共证书/密钥,并提交 SAML SP 的 entityID 和 AssertionConsumerService URL。

    问题:“我尝试创建自己的密钥库并从 IdP 的元数据文件中导入 x509 证书数据,但我收到错误消息,指出我的签名错误。”

    回答
    (1) 通常 SAML SP 需要创建与 SAML IdP 分开的不同密钥和证书。换句话说,SAML SP 和 SAML IdP 携带的公共证书/密钥应该是不同的,如提供的示例 SAML SP 元数据“sp-example-org.xml”和示例 SAML IdP“idp-metadata.xml”所示Shibboleth IdP and SP testbed 在 GitHub 存储库中。

    GitHub 存储库中的How to build and run Shibboleth SAML IdP and SP using Docker container 提供了有关使用 Shibboleth SAML IdP、OpenLDAP 和 Shibboleth SAML SP 构建 SAML IdP 和 SAML SP 的说明。

    (I) shibboleth-sp-testapp/shibboleth-sp/ 提供 OpenSSL 生成的 SAML SP 密钥和证书示例。

    sudo openssl req -x509 -sha256 -nodes -days 3650 -newkey rsa:2048 -subj "/CN=sp.example.org" -keyout /etc/ssl/private/sp.example.org.key -out /etc/ssl/certs/sp.example.org.crt
    

    (II) shibboleth-idp-dockerized/ext-conf/credentials/ 提供 SAML IdP 密钥和证书的示例。

    (III) shibboleth-idp-dockerized/ext-conf/metadata/ 提供了对应的 SAML IdP 元数据文件和 SAML SP 元数据文件的示例。

    问题:“我也尝试直接从证书文件创建密钥库,但我收到一个错误,提示我缺少私钥。”

    回答
    IdP 的元数据文件仅包含公共证书/密钥,但 是否包含私有密钥。

    因此,您可以通过从 IdP 的元数据文件导入 x509 证书数据来创建自己的密钥库。

    问题:“我没有直接从 IdP 获得任何密钥或证书文件,他们告诉我我需要的所有数据都在元数据文件中。”

    回答
    他们是正确的。您需要的所有数据都在 IdP 元数据文件中。

    IdP 元数据文件仅包含公共证书,不包含私钥。

    您可以手动从 IdP 元数据中提取公共证书/密钥,然后使用提供的模板创建公共证书文件 shibboleth-idp-dockerized/ext-conf/credentials/idp-signing.crt。请注意,通常您不需要创建 SAML IdP 的公共证书文件,因为大多数 SAML SP(例如 Shibboleth SAML SP)会在需要时从 IdP 元数据文件中提取公共证书(如“配置的两种典型方法SAML SP 与 SAML IdP,具体取决于上述解决方案中对 SAML IdP 的不同要求)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      相关资源
      最近更新 更多