什么我需要知道关于XML签名,以获得CA工作?
-
20-09-2019 - |
题
我们在工作中有一个网应用程序,我们将需要接口,与另一个公司的网络应用程序使用单一签证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的,只是因为互操作性问题可能会想出了需要可能进行调试,
你可以看看在这Java lib签署的身份请求例子 https://github.com/jrowny/java-saml
验证的签名你需要安装CA示踪剂插件 https://addons.mozilla.org/en-US/firefox/addon/saml-tracer/
你可以使用的工具 https://www.samltool.com/validate_logout_req.php 到vaalidate或签名的请求 https://www.samltool.com/sign_logout_req.php