Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 要使SAML正常工作,我需要了解哪些XML签名?_Php_Xml_Digital Signature_Saml_Xml Signature - Fatal编程技术网

Php 要使SAML正常工作,我需要了解哪些XML签名?

Php 要使SAML正常工作,我需要了解哪些XML签名?,php,xml,digital-signature,saml,xml-signature,Php,Xml,Digital Signature,Saml,Xml Signature,在工作中,我们有一个web应用程序,需要使用SAML验证的单点登录与另一家公司的web应用程序接口。我们的web应用程序是用PHP编写的,显然与其他公司使用的语言无关。尽管如此,我还是需要编写一个简单的API,该公司可以使用SAML请求向其发送SOAP请求,并生成一个SAML响应。我从头开始写它有三个原因:1)用PHP编写的SAML交互似乎没有太多选项,即使我想要一个,2)它限制了添加另一个第三方组件所涉及的开销,而且,3)从头开始创造事物通常会让我对事物有更好的理解,并使我在将来需要时能够更好

在工作中,我们有一个web应用程序,需要使用SAML验证的单点登录与另一家公司的web应用程序接口。我们的web应用程序是用PHP编写的,显然与其他公司使用的语言无关。尽管如此,我还是需要编写一个简单的API,该公司可以使用SAML请求向其发送SOAP请求,并生成一个SAML响应。我从头开始写它有三个原因:1)用PHP编写的SAML交互似乎没有太多选项,即使我想要一个,2)它限制了添加另一个第三方组件所涉及的开销,而且,3)从头开始创造事物通常会让我对事物有更好的理解,并使我在将来需要时能够更好地适应事物

总之,一般来说,我对SAML、SOAP和XML标准相当陌生,所以我一直在自学。就我们的目的而言,我的API已经相当完整了,但有一个例外,那就是另一家公司指定我们的响应需要使用证书进行数字签名(我们收到的请求也将进行数字签名)。所以我一直在试图弄清楚如何处理/生成XML签名,但老实说,这有点让人困惑,因为W3C规范并不是很容易理解的

文档的第5.4.8节(我一直在编写的文档,因为另一家公司说他们将使用v1.1)包括一个包含签名断言的签名响应示例,我将在这里包括该示例以供参考:

<Response IssueInstant="2003-04-17T00:46:02Z" MajorVersion="1" MinorVersion="1"
 Recipient="www.opensaml.org" ResponseID="_c7055387-af61-4fce-8b98-e2927324b306"
 xmlns="urn:oasis:names:tc:SAML:1.0:protocol"
 xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <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="#_c7055387-af61-4fce-8b98-e2927324b306">
    <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#">
      <InclusiveNamespaces PrefixList="#default saml samlp ds xsd xsi"
       xmlns="http://www.w3.org/2001/10/xml-exc-c14n#"/>
     </ds:Transform>
    </ds:Transforms>
    <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
    <ds:DigestValue>TCDVSuG6grhyHbzhQFWFzGrxIPE=</ds:DigestValue>
   </ds:Reference>
  </ds:SignedInfo>
  <ds:SignatureValue>x/GyPbzmFEe85pGD3c1aXG4Vspb9V9jGCjwcRCKrtwPS6vdVNCcY5rHaFPYWkf+5EIYcPzx+pX1h43SmwviCqXRjRtMANWbHLhWAptaK1ywS7gFgsD01qjyen3CP+m3Dw6vKhaq1ed10BYyrIzb4KkHO4ahNyBVXbJwqv5pUaE4=</ds:SignatureValue>
  <ds:KeyInfo>
   <ds:X509Data>
    <ds:X509Certificate>MIICyjCCAjOgAwIBAgICAnUwDQYJKoZIhvcNAQEEBQAwgakxCzAJBgNVBAYTA1VT ... 8I3bsbmRAUg4UP9hH6ABVq4KQKMknxu1xQxLhpR1y1GPdiowMNTrEG8cCx3w/w==</ds:X509Certificate>
   </ds:X509Data>
  </ds:KeyInfo>
 </ds:Signature>
 <Status><StatusCode Value="samlp:Success"/></Status>
 <Assertion AssertionID="_a75adf55-01d7-40cc-929f-dbd8372ebdfc"
  IssueInstant="2003-04-17T00:46:02Z" Issuer="www.opensaml.org"
  MajorVersion="1" MinorVersion="1" xmlns="urn:oasis:names:tc:SAML:1.0:assertion"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Conditions NotBefore="2003-04-17T00:46:02Z" NotOnOrAfter="2003-04-17T00:51:02Z">
   <AudienceRestrictionCondition>
    <Audience>http://www.opensaml.org</Audience>
   </AudienceRestrictionCondition>
  </Conditions>
  <AuthenticationStatement AuthenticationInstant="2003-04-17T00:46:00Z"
   AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:password">
   <Subject>
    <NameIdentifier Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">scott@example.org</NameIdentifier>
    <SubjectConfirmation>
     <ConfirmationMethod>urn:oasis:names:tc:SAML:1.0:cm:bearer</ConfirmationMethod>
    </SubjectConfirmation>
   </Subject>
   <SubjectLocality IPAddress="127.0.0.1"/>
  </AuthenticationStatement>
  <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="#_a75adf55-01d7-40cc-929f-dbd8372ebdfc">
     <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#">
       <InclusiveNamespaces PrefixList="#default saml samlp ds xsd xsi"
        xmlns="http://www.w3.org/2001/10/xml-exc-c14n#"/>
      </ds:Transform>
     </ds:Transforms>
     <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
     <ds:DigestValue>Kclet6XcaOgOWXM4gty6/UNdviI=</ds:DigestValue>
    </ds:Reference>
   </ds:SignedInfo>
   <ds:SignatureValue>hq4zk+ZknjggCQgZm7ea8fI79gJEsRy3E8LHDpYXWQIgZpkJN9CMLG8ENR4Nrw+n7iyzixBvKXX8P53BTCT4VghPBWhFTSt9tHWu/AtJfOTh6qaAsNdeCyG86jmtp3TDMWuL/cBUj2OtBZOQMFn7jQ9YB7k1Iz3RqVL+wNmeWI4=</ds:SignatureValue>
   <ds:KeyInfo>
    <ds:X509Data>
     <ds:X509Certificate>MIICyjCCAjOgAwIBAgICAnUwDQYJKoZIhvcNAQEEBQAwgakxCzAJBgNVBAYTA1VT ... 8I3bsbmRAUg4UP9hH6ABVq4KQKMknxu1xQxLhpR1y1GPdiowMNTrEG8cCx3w/w==</ds:X509Certificate>
    </ds:X509Data>
   </ds:KeyInfo>
  </ds:Signature>
 </Assertion>
</Response>

TCDVSUG6GRHYHBZHQFWZGRXIPE=
x/GYPBZMFEE85PGD3C1AXG4VSPB9V9JGCJWCRCKRTWPS6VDVNCY5RHAFPYWKF+5EIYcPzx+PX1H43SMWVICQRJRTMANWBHLHWAPTAK1YWS7GFGSD01QJYEN3CP+M3DW6VKHAQ110BYRZB4KHNYBJWQV5UAE4=
MIICyjCCAjOgAwIBAgICAnUwDQYJKoZIhvcNAQEEBQAwgakxCzAJBgNVBAYTA1VT。。。8I3bsbmRAUg4UP9hH6ABVq4KQKMknxu1xQxLhpR1y1GPdiowMNTrEG8cCx3w/w==
http://www.opensaml.org
scott@example.org
urn:oasis:name:tc:SAML:1.0:cm:bearier
Kclet6XcaOgOWXM4gty6/UNDVI=
hq4zk+ZknjggCQgZm7ea8fI79gJEsRy3E8LHDpYXWQIgZpkJN9CMLG8ENR4Nrw+N7IYZIXBVKXX8P53BTCT4VGHPWHFTST9THWU/ATJFOTH6QAANDECYG86JMTP3TDMWUL/cBUj2OtBZOQMFn7jQ9YB7k1Iz3RqVL+WNME4=
MIICyjCCAjOgAwIBAgICAnUwDQYJKoZIhvcNAQEEBQAwgakxCzAJBgNVBAYTA1VT。。。8I3bsbmRAUg4UP9hH6ABVq4KQKMknxu1xQxLhpR1y1GPdiowMNTrEG8cCx3w/w==
那么我如何生成这样的东西呢?如果我收到这样的东西,我如何验证它?另外,有人能提供一个关于
标签的基本概念概述吗?似乎有两个
标记,一个在主
中,一个在
中,每个都包含自己的
(并且每个都不同)。这些是如何产生的?如果您能对此有所了解,我们将不胜感激。教程或代码示例将更受欢迎!但在这一点上,如果你能让我走上正轨,这就是我真正想要的。现在这一切对我来说仍然像一个大黑匣子


顺便说一句,如果这有帮助的话,它在SAML1.1规范的其他地方说SAML实现应该只使用“独占规范化”方法(Excl-C14N),并且应该只使用“包络变换”。我仍然不能完全确定这意味着什么。

中的xmlseclibs.php中有一个例子。它依赖于openssl模块进行加密


老实说,我会使用到java/tomcat的lib或桥接器,只是因为可能会出现互操作问题,可能需要进行调试,

如果您非常熟悉XML,处理XML签名其实并不太困难,但有很多细节必须绝对正确,否则会出现问题,因此,在这种情况下,我可能不会尝试编写自己的实现(我曾经部分实现过它,但那是为了一个不同的特殊目的,无论如何,它不是一个完整的实现)

无论如何,我对SAML了解不多,但我确实了解XML和XML签名,所以也许我可以通过尝试回答您的问题为您提供一些方法

Signature
元素是指已在其
SignedInfo
子元素中进行数字签名的XML文档的特定部分。该元素的
Reference
子元素(我认为在形成要签名的字节时,可能会有许多
Reference
元素连接在一起,但我不再记得了)通过
URI
属性指向内容。
Transform
元素描述在散列引用的内容之前对其执行的转换;您需要查看规范,以了解转换算法是如何定义的。
DigestMethod
元素给出了应用于这些转换算法的结果字节的哈希算法(请注意,其中之一始终是将XML转换为字节的规范化),而
DigestValue
给出了该摘要算法的结果

实际签名位于
SignatureValue
元素中,通过应用
规范化方法来生成字节,然后使用
SignatureMethod
对这些字节进行签名来生成。
KeyInfo
元素告诉您如何找到要使用的密钥

上面多次出现的规范化只是将XML文档转换为字节的一种方法,以便“等效”XML文档生成相同的字节序列。这是数字图书馆所必需的