我正在努力通过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)
答案 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存储库中。
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要求)。