我们在工作中有一个网应用程序,我们将需要接口,与另一个公司的网络应用程序使用单一签证API.我们的网络应用程序是PHP编写的,它显然是无关紧要什么样的语言选择的其他公司使用。尽管如此,我需要写一个简单的API,这一其他的公司可以发送肥皂请求与CA请求,并产生后证书的策略的回应。我已经写,它从头用于三个原因: 1) 那不是真的似乎是很多选择CA的相互作用PHP编写的,甚至如果我想要一个, 2) 这限制了开销,这将涉及增加的另一个第三方分, 3) 创造的东西从头通常会留下我一个显着更好的了解,并使我更能够适应的事,在未来如果需要的话。

不管怎么说,我相当新的,CA,肥皂和XML标准,在一般情况下,所以我一直教导我走。我已经得到了API差不多完成了我们的目的,有一个例外,其他公司已经指出,我们的反应将需要进行数字签字有证书(和请求,我们收到将同样以进行数字签字)。所以我一直试图找出如何处理/生成XML签名,但说实话这有点令人混淆,因为W3C specs不是光阅读。

部分5.4.8的 的断言和协议的绿洲的安全标记语言(CA)V1。1 文件(该文件,我已经去掉,因为其他公司表示他们将使用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>

所以,我怎么产生这样的事情?如果我收到像这样的东西,我怎么验证吗?此外,任何人都可以提供一个基本概念的是什么 <ds:Signature> 标记在这里?这似乎有两个 <ds:Signature> 标签,在一个主要的 <Response> 和一个在 <Assertion>, 每个含有自己的 <ds:DigestValue>, <ds:SignatureValue>, , <ds:X509Certificate> (与每个不同).怎么产生的呢?任何灯光,你可以摆脱这将非常感激。教或码的例子将会甚至更多的理解!但在这一点上,如果你可以让我在正确的轨道,这是所有我是真的要求。现在这一切似乎仍然像一个大的黑盒子给我。

顺便说一句,如果这有帮助,它说在其他地方在临时1.1规范CA的实现应使用"异的规范化"的方法只有(不包括-C14N),并应使用"笼罩改变"。我还不完全知道这意味着什么。

有帮助吗?

解决方案

处理XML签名是不是真的太难了,如果你是非常熟悉XML,但也有很多的必须是绝对正确或事情不工作的细节,所以我可能不会尝试写我自己在这种情况下实施(我没有实现它部分一次,但这是一个不同的,特殊用途的,反正这不是一个完整的实现)。

反正,我不知道很多关于SAML,但我不知道XML和XML签名,所以也许我可以试着回答您的问题给你一些的方式。

一个Signature元件是指一个特定的一块已在其SignedInfo子元素进行了数字签名,一个XML文档的。的是,Reference子元素(我想可能有很多Reference元素形成要签名的字节时得到的级联,但我不记得是肯定的了)点,通过URI属性的内容。所述Transform元素描述上执行的转换的参照的前哈希处理内容;你需要看规格找出转换算法是如何定义的。所述DigestMethod元件给出了散列算法,以适用于作为这些变换算法的结果的字节(注意,它们中的一个始终是转换XML成字节规范化)和DigestValue给出了摘要算法的结果。

实际的签名是在SignatureValue元件,并且是通过将CanonicalizationMethod元件的标准化,以产生字节长,并签署与SignatureMethod这些字节生成。该KeyInfo元素告诉你如何找到要使用的密钥。

规范化,从而出现了几次的上方,是简单地将XML文档转换成字节,使得“等效”的XML文档产生字节的相同序列的方法。这是在一个数字签名必需的,因为算法对字节和XML的工作可以通过一些中介机构,可能会打乱原有的字节,但将保留等价。并且需要针对不同的情况不同的规范化方法:如果元素从文档中提取并放置到别人,你需要除掉不必要的命名空间定义独家标准化,但在其他情况下可能无法正常工作,所以你需要包容性的标准化来代替,该保留了所有范围的命名空间。

这仅仅是基本知识。有一些在如何生成XML签名不同的选项,如果你想实现一个工作验证,你需要考虑所有的人。既然你是新来的一般XML,我只是重复我的使用已经存在的东西的意见。这是一个有趣的学习经验,以实现规范,但往往是在浪费时间,如果实现已经上市。

有大约签名W3C的文档

其他提示

有在 SimpleSAML xmlseclibs.php一个例子。它依赖OpenSSL的模块上做加密。

我就老老实实使用lib或桥梁的Java / Tomcat的,只是因为互操作性问题可能会想出了需要可能进行调试,

  1. 你可以看看在这Java lib签署的身份请求例子 https://github.com/jrowny/java-saml

  2. 验证的签名你需要安装CA示踪剂插件 https://addons.mozilla.org/en-US/firefox/addon/saml-tracer/

  3. 你可以使用的工具 https://www.samltool.com/validate_logout_req.php 到vaalidate或签名的请求 https://www.samltool.com/sign_logout_req.php

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top