SP元数据:用于签名和加密的证书

时间:2014-07-15 04:53:57

标签: cryptography saml-2.0 shibboleth service-provider

规范说:

Metadata for the OASIS Security Assertion Markup Language (SAML) V2.0

  

2.4.1.1元素<KeyDescriptor>

     

<KeyDescriptor>元素提供有关加密密钥的信息   实体用于签署数据或接收加密密钥,以及附加   加密细节。它的KeyDescriptorType复杂类型包括   以下元素和属性:

     

use [可选]

     

可选属性,指定所描述的密钥的用途。值来自KeyTypes枚举,由值encryptionsigning组成。

     

<ds:KeyInfo> [必需]

     

直接或间接标识密钥的可选元素。

据我所知,为了向两个方向发送安全数据,我应该:

  1. 我自己的私钥
  2. 我自己的公钥
  3. 收件人的公钥
  4. 我应该在SP元数据中指定什么密钥的证书,并且我可以使用相同的证书进行签名和加密?

    IdP的供应商提供了所谓的“元数据模板”,其中指出了应该拼写的内容和位置。

    这是相关部分(逐字):

    ...
    <md:KeyDescriptor use="signing"> 
       <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
          <ds:X509Data> 
             <ds:X509Certificate> 
                <!--
                 TODO It is necessary to insert here the certificate of the signature 
                 key of the service provider in X509 DER format and Base64 encoded
                 --> 
              </ds:X509Certificate> 
          </ds:X509Data> 
       </ds:KeyInfo> 
    </md:KeyDescriptor> 
    
    <md:KeyDescriptor use="encryption"> 
       <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
          <ds:X509Data> 
             <ds:X509Certificate> 
                <!--
                 TODO It is necessary to insert here the certificate of the signature 
                 key of the service provider in X509 DER format and Base64 encoded
                 --> 
             </ds:X509Certificate> 
          </ds:X509Data> 
       </ds:KeyInfo> 
    </md:KeyDescriptor> 
    ...
    

    我这样做:

    ...   
    <md:KeyDescriptor use="signing">
        <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
            <ds:X509Data>
                <ds:X509Certificate>
                    MIID...ZiQ==
                </ds:X509Certificate>
            </ds:X509Data>
        </ds:KeyInfo>
    </md:KeyDescriptor>
    <md:KeyDescriptor use="encryption">
        <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
            <ds:X509Data>
                <ds:X509Certificate>
                    MIID...ZiQ==
                </ds:X509Certificate>
            </ds:X509Data>
        </ds:KeyInfo>
    </md:KeyDescriptor>
    ...
    

    它不起作用。

    因此,AFAIK用于签名我应该使用我的私钥证书,而对于加密,我应该使用IdP的开放密钥证书。

    恕我直言应该如此。

    ...
    <md:KeyDescriptor use="signing">
        <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
            <ds:X509Data>
                <ds:X509Certificate>
                    <!-- certificate of my private key here-->
                </ds:X509Certificate>
            </ds:X509Data>
        </ds:KeyInfo>
    </md:KeyDescriptor>
    <md:KeyDescriptor use="encryption">
        <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
            <ds:X509Data>
                <ds:X509Certificate>
                    <!-- certificate of the open key of IdP here -->
                </ds:X509Certificate>
            </ds:X509Data>
        </ds:KeyInfo>
    </md:KeyDescriptor>
    ...
    

    我是对的吗?

    我将非常感谢这些信息。谢谢大家。

1 个答案:

答案 0 :(得分:6)

您自己服务的元数据应包含带有证书的公钥。是的,您可以使用相同的签名和加密。

当IDP想要加密要发送到SP的数据时,它使用SP的公钥来实现。因此,不需要包含“IdP的开放密钥证书”作为加密密钥。

您提到使用相同的密钥进行签名和加密都不起作用,您是否能够获得有关确切失败的原因和位置的更多详细信息?