OIOSAML AuthnResponse:无法加密断言

时间:2014-07-10 17:03:00

标签: java single-sign-on saml-2.0 shibboleth opensaml

我想实现一个简单的场景:

  1. 用户尝试访问信息系统
  2. 的受保护资源
  3. 信息系统向身份提供商发送请求以对用户进行身份验证
  4. 身份提供商验证用户是否有开放会话,如果没有活动会话,则执行用户身份验证(身份提供商将用户重定向到可以输入用户名/密码的网页)
  5. 如果用户成功通过身份验证,身份提供商会向信息系统发送包含用户标识信息的语句集
  6. 根据从身份提供商收到的信息,信息系统对用户进行身份验证以访问受保护资源
  7. 作为信息系统(服务提供商),我使用 OIOSAML 。远程idP基于Shibboleth(在客户方面,关于它我什么都不知道。只是它是基于Shibboleth编写的)

    来自docs

      

    OIOSAML.java服务提供程序包实现了一个   符合Servlet的SAML服务提供程序,用于SAML联合。   该软件包实现了所有必要的功能   符合OIOSAML标准的服务提供商。

         

    包的主要组件是servlet过滤器,它可以处理   用户认证。过滤器检查用户是否已经   经过身份验证,如果没有,则将用户重定向到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:

    # 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>
    

    生成的URLEncode字符串:

    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>
    

    这意味着什么以及如何克服它? 我非常感谢这些信息。谢谢大家。

1 个答案:

答案 0 :(得分:1)

身份提供商需要拥有OIOSAML应用程序的公共证书,才能在将响应发送回OIOSAML之前加密断言。错误消息可能表示它已丢失。

请问您是否可以验证包含您导入到Shibboleth的OIOSAML应用程序相关信息的SAML元数据是否包含带有证书信息的元素<md:KeyDescriptor use="encryption">

作为一种解决方法,您可以在HTTPS端口上部署OIOSAML应用程序(在元数据中生成URL,例如https://localdomain.com:8443/..。)并将元数据重新导入Shibboleth。默认情况下,Shibboleth不会尝试加密断言,以防它通过加密通道提供回服务提供商应用程序。