我想实现一个简单的场景:
试图访问信息系统受保护资源的用户
信息系统向身份提供程序发送请求以验证用户身份
身份提供程序验证用户是否有打开的会话,如果没有活动会话,则执行用户身份验证(身份提供程序将用户重定向到可在其中输入用户名/密码的网页)
如果用户成功通过身份验证,则身份提供程序将包含用户身份信息的一组语句发送给信息系统
根据从身份提供者收到的信息,信息系统验证用户对受保护资源的访问
作为信息系统(服务提供商),我使用OIOSAML。基于Shibboleth的远程idp(在客户方面,对此我一无所知。只是它是根据希伯莱写的)
从docs:
java服务提供者包实现了
在saml联合中使用的与servlet兼容的saml服务提供者。
该包实现了作为
符合OIOSAML的服务提供商。
包的主要组件是一个处理
用户身份验证。过滤器检查用户是否已经
经过身份验证,如果没有,则用户被重定向到saml标识
供应商。当用户返回一个saml断言时,该断言
验证,并为用户创建新会话。这个
应用程序可以访问接收到的断言及其属性
通过编程api。
IDP和服务提供商配置通过标准
saml元数据。
我的web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
<display-name>OIOSAML-J</display-name>
<listener>
<listener-class>dk.itst.oiosaml.sp.service.session.SessionDestroyListener</listener-class>
</listener>
<servlet>
<servlet-name>SAMLDispatcherServlet</servlet-name>
<servlet-class>dk.itst.oiosaml.sp.service.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SAMLDispatcherServlet</servlet-name>
<url-pattern>/saml/*</url-pattern>
</servlet-mapping>
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>dk.itst.oiosaml.sp.service.SPFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/protected/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
我的oiosaml-sp.属性:
# Properties used by oiosaml-j
# Reference to the location of the certificate used for signing SAML documents with - relative to ${oiosaml.home}
oiosaml-sp.certificate.location=./certificate/keystore
# Opaque/encrypted password to the certificate used for signing SAML documents
oiosaml-sp.certificate.password=some_password
# Required authentication level. 2=password, 3=certificate
oiosaml-sp.assurancelevel=2
# Name of the meta data file for the current service provider - overrides setting in brs-common.properties
common.saml2.metadata.sp.filename=SPMetadata.xml
# URI References to the current service provider
oiosaml-sp.uri.home=
# Whether to validate server certificates. Set to false in production.
# Used for artifact resolution.
oiosaml-sp.resolve.ignorecert=true
# Artifact resolution username and password. Only used the artifact profile is active.
oiosaml-sp.resolve.username=rolf.trifork.com
oiosaml-sp.resolve.password=rolf.trifork.com
生成
AuthnRequest
:<?xml version="1.0" encoding="UTF-8"?>
<saml2p:AuthnRequest xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
AssertionConsumerServiceURL="http://.../saml/SAMLAssertionConsumer"
Destination="https://someidentityprovider/idp/profile/SAML2/Redirect/SSO" ForceAuthn="false"
ID="_183...4" IsPassive="false"
IssueInstant="2014-07-10T05:48:02.564Z"
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">some_information</saml2:Issuer>
</saml2p:AuthnRequest>
结果字符串:
https://someidentityprovider/idp/profile/SAML2/Redirect/SSO?SAMLRequest=fVL...x3%2B8w%2Fws%3D
&RelayState=_27a...b8d25d4df
&SigAlg=http%3A%2F%2Fwww.w3.org%2F2000%2F09%2Fxmldsig%23dsa-sha1
&Signature=MCwCFFIXyH...%3D
系统工作正常,当我通过受保护的映射执行请求时,我会得到身份提供者的登录页面,在那里我可以输入两个登录/密码来继续。
但是,标识提供程序发送此响应:
<?xml version="1.0" encoding="UTF-8"?>
<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" Destination="..."
ID="_3d00f0e5401c168ab42eeafc78726e5e" InResponseTo="_b67...3c10"
IssueInstant="2014-07-10T15:33:56.788Z" Version="2.0">
<saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">
https://.../shibboleth
</saml2:Issuer>
<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/2000/09/xmldsig#rsa-sha1"/>
<ds:Reference URI="#_3d00f0...726e5e">
<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/2000/09/xmldsig#sha1"/>
<ds:DigestValue>yq/0...I=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
IR76Xd51+Vwi...w==
</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MIID...zQG</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
<saml2p:Status>
<saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Responder"/>
<saml2p:StatusMessage>Unable to encrypt assertion</saml2p:StatusMessage>
</saml2p:Status>
</saml2p:Response>
所以,
<saml2p:Status>
<saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Responder"/>
<saml2p:StatusMessage>Unable to encrypt assertion</saml2p:StatusMessage>
</saml2p:Status>
这意味着什么以及如何克服它?
最佳答案
身份提供程序需要有您的oiosaml应用程序的公共证书,以便在将响应发送回oiosaml之前能够加密断言。错误消息可能表示它已丢失。
请验证您导入到shibboleth的oiosaml应用程序的saml元数据是否包含带有证书信息的元素<md:KeyDescriptor use="encryption">
?
作为解决方法,您可以将oiosaml应用程序部署到https端口(在元数据中有一个结果url,例如https://localdomain.com:8443/..),然后将元数据重新导入shibboleth。默认情况下,shibboleth不会尝试加密断言,以防通过加密通道将其提供回服务提供商应用程序。