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

Posted

技术标签:

【中文标题】SP 元数据:用于签名和加密的证书【英文标题】:SP metadata: certificate for signing and encryption 【发布时间】:2014-09-05 04:03:41 【问题描述】:

规范说:

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

2.4.1.1 元素<KeyDescriptor>

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

use[可选]

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

<ds:KeyInfo>[必填]

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

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

    我自己的私钥 我自己的公钥 收件人的公钥

我应该在 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】:

您自己的服务的元数据应包含您的公钥和证书。是的,您可以将同一个用于签名和加密。

当 IDP 想要加密要发送到 SP 的数据时,它使用 SP 的公钥来执行此操作。因此,无需将“IdP 的开放密钥证书”作为加密密钥。

您提到使用相同的密钥进行签名和加密是行不通的,您是否能够获得更多关于究竟是什么失败以及在哪里失败的详细信息?

【讨论】:

不客气,Alexey。是的,从 SP 发送到 IdP 的请求大多不使用 XML 加密。消息通常通过已提供传输层加密的 https 通道发送,因此无需在消息层再次加密。

以上是关于SP 元数据:用于签名和加密的证书的主要内容,如果未能解决你的问题,请参考以下文章

SAML2 元数据 - 多重签名证书

Spring SAML:更新元数据提供程序不会更新使用的签名证书

SP 元数据签名

Spring Security SAML IdP 元数据证书和签名

如何为 SAML SP 元数据使用 Tomcat SSL 证书

签名证书和加密证书的区别