如何从IdP元数据为SP创建密钥库

时间:2019-06-03 18:03:13

标签: java spring-mvc saml

我正在努力通过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)

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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 Update 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 SP元数据的URL提供给SAML IdP(即Microsoft ADFS),以便
Microsoft ADFS可以下载SAML SP元数据,从SP元数据中提取SP公共证书/密钥,然后使用SP公共证书/密钥来验证已签名的AuthnRequest。

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

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

根据SAML IdP的不同要求,下面列出了两种使用SAML IdP配置SAML SP的典型方法。

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

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

(选项II)提供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获得任何密钥或证书文件,他们告诉我所需的所有数据都在Metadata文件中。”

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

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

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