我有这样的XML
<?xml version="1.0" encoding="utf-8"?>
<foo>
<bar>
<value>A</value>
</bar>
<bar>
<value>B</value>
</bar>
<baz>
<value>C</value>
</baz><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /><DigestValue>WqpRWHxXA0YgH+p3Sxy6hRo1XIk=</DigestValue></Reference></SignedInfo><SignatureValue>EoRk/GhR4UA4D+8AzGPPkeim1dZrlSy88eF73n/T9Lpeq9IxoGRHNUA8FEwuDNJuz3IugC0n2RHQQpQajiYvhlY3XG+z742pgsdMfFE4Pddk4gF1T8CVS1rsF7bjX+FKT/c8B2/C8FNgmfkxDlB/ochtbRvuAGPQGtgJ3h/wjSg=</SignatureValue><KeyInfo><X509Data><X509Certificate>MIIB8zCCAVygAwIBAgIQgfzbrIjhLL9FobStI2ub3zANBgkqhkiG9w0BAQQFADATMREwDwYDVQQDEwhUZXN0ZUFjbjAeFw0wMDAxMDEwMDAwMDBaFw0zNjAxMDEwMDAwMDBaMBMxETAPBgNVBAMTCFRlc3RlQWNuMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDO+yAZ8/qJbhSVH/+2wMmzix3jM/CExb6sTgaiPwe6ylcHgF45zeQDq06OSJZCSns34em/ULINZddDf8z0b9uk/2sOGr1pYqsunLLBvw2FkvWJQDkhx2SzCm8v4xGX2kyXNbjiY/K56oPOMjpayKoAFnnvk7p2iFAxNZK/6lpZ7wIDAQABo0gwRjBEBgNVHQEEPTA7gBCOOHcajwnATYZ0t6w7LVU0oRUwEzERMA8GA1UEAxMIVGVzdGVBY26CEIH826yI4Sy/RaG0rSNrm98wDQYJKoZIhvcNAQEEBQADgYEABL9Qhi6f1Z+/t8oKXBQFx3UUsNF9N2o4k6q1c3CKZYqx2E/in+nARIYRdh5kbeLfomi6GIyVFeXExp8crob3MAzOQMvXf9+ByuezimMPIHDvv0u3kmmeITXfoZrHCDxLoWWlESN1owBfKPqe7JKAuu9ORDC0pUiUfCHWxCoqNos=</X509Certificate></X509Data></KeyInfo></Signature>
</foo>
Run Code Online (Sandbox Code Playgroud)
如何创建引用中的摘要值(WqpRWHxXA0YgH + p3Sxy6hRo1XIk =)?我的意思是如何手动计算这个值?
当存在名称空间前缀时,无法通过Id属性对元素进行签名:
void Main()
{
var doc = new XmlDocument();
doc.LoadXml("<root xmlns:u=\"myuri\"><test u:Id=\"_0\">Zebra</test></root>");
SignedXml signedXml = new SignedXml(doc);
signedXml.SigningKey = new RSACryptoServiceProvider();
Reference reference = new Reference("#_0");
signedXml.AddReference(reference);
signedXml.ComputeSignature();
}
Run Code Online (Sandbox Code Playgroud)
ComputeSignature()
这里会出现'格式错误的参考元素'应该怎么做?
我正在尝试使用Java 对XML文档进行数字签名.我有一个实现使用一些引用,我发现在javax.xml.crypto.dsig
包中使用各种实现.
不过,我目前的实现是像很多的例子我已经看了-这是相当繁琐,使用从不下23种不同的API类包括java.xml.crypto.dsig
,javax.xml.transform
,和java.security
包,等等.感觉就像我进入了工厂工厂的土地,我花了好几个小时来弄清楚发生了什么.
我的问题是,有更简单的方法吗?如果我有公共/私人密钥文件,并且我想要添加<Signature/>
到XML文档,那么是否有一个库让我调用类似的东西:
OutputStream signFile(InputStream xmlFile, File privateKey)
Run Code Online (Sandbox Code Playgroud)
...没有所有的XMLSignatureFactory/CanonicalizationMethod/DOMSignContext疯狂?
我不是非常精通密码术,而且像我这样的开发人员试图熟悉数字签名,Java提供的API似乎相当令人生畏.如果所有这些都是必要的,或者目前没有友好的API,那很好,我愿意接受这个作为答案.我只是想知道我是否在这里不必要地走上了艰难的道路.
在工作中,我们有一个Web应用程序,我们需要使用SAML验证的单点登录与其他公司的Web应用程序进行交互.我们的网络应用程序是用PHP编写的,显然与其他公司使用的语言选择无关.尽管如此,我还需要编写一个简单的API,这个其他公司可以使用SAML请求发送SOAP请求,并生成SAML响应.我从头开始编写它有三个原因:1)用PHP编写的SAML交互似乎没有很多选项,即使我想要一个,2)它限制了添加另一个第三个所涉及的开销-party组件,以及3)从头开始创建东西通常会让我有更好的理解,并且如果需要的话,使我能够更好地适应未来的事情.
无论如何,我对SAML,SOAP和XML标准一般都是新手,所以我一直在教我自己.我已经为我们的目的提供了相当完整的API,但有一个例外,即另一家公司已经指定我们的响应将需要使用证书进行数字签名(我们收到的请求将同样进行数字签名).所以我一直在试图弄清楚如何处理/生成XML签名,但老实说,由于W3C规范并不完全轻松,所以有点令人困惑.
OASIS安全标记语言(SAML)V1.1文件的断言和协议的第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" …
Run Code Online (Sandbox Code Playgroud) 如何从证书存储中获取X509Certificate,然后在.net C#中生成XML SignatureData?
我正在寻找一个允许创建和验证XAdES签名的Java库(格式越多越好:XAdES-BES,XAdES-C,XAdES-XL等).
我发现最有趣的实现是:
您建议使用哪个或建立哪个?
我对RSA-SHA1感到困惑,我认为它是RSA_private_encrypt(SHA1(消息)).但我无法获得正确的签名值.有什么不对的吗?
操作系统:安装了.NET 4.5的Visual Studio Pro 2012的Windows 7 64位.
我在Visual Studios中使用了Publish选项并确保我单击了Sign the clickOnce清单并签署了Assembly.它仍然无法在另一台计算机上运行,并且说我没有有效的XML签名.我已粘贴下面的错误消息.
我还读过:如何移动ClickOnce部署包,我是否必须签署ClickOnce清单?.VS2012 .NET 4.0 Clickonce VSTO CryptographicException:无法为提供的签名算法和其他几个算法创建SignatureDescription.
我需要能够在.NET 4.0上部署我的程序至少,我无法访问另一个版本的Visual Studios.提前致谢!
完成错误如下:
PLATFORM VERSION INFO Windows:5.1.2600.196608(Win32NT)公共语言运行时:2.0.50727.3603 System.Deployment.dll:2.0.50727.3053(netfxsp.050727-3000)mscorwks.dll:2.0.50727.3603(GDR.050727-3600)dfdll. DLL:2.0.50727.3053(netfxsp.050727-3000)dfshim.dll:4.0.31106.0(Main.031106-0000)
来源部署网址:file:/// C:/Documents%20and%20Settings/Administrator/Desktop/EatonWizard.application
错误摘要以下是错误的摘要,这些错误的详细信息将在后面的日志中列出.*激活C:\ Documents and Settings\Administrator\Desktop\EatonWizard.application导致异常.检测到以下失败消息:+来自file:/// C:/Documents%20and%20Settings/Administrator/Desktop/EatonWizard.application的异常读取清单:清单可能无效或无法打开文件.+ Manifest XML签名无效.无法为提供的签名算法创建+ SignatureDescription.
组件存储事务故障摘要未检测到事务错误.
警告此操作期间没有警告.
操作进度状态*[10/10/2012 2:05:02 PM]:已启动C:\ Documents and Settings\Administrator\Desktop\EatonWizard.application的激活.
错误详细信息在此操作期间检测到以下错误.*[10/10/2012 2:05:02 PM] System.Deployment.Application.InvalidDeploymentException(ManifestParse) - 来自file:/// C:/Documents%20and%20Settings/Administrator/Desktop/EatonWizard.application的异常读取清单:清单可能无效或无法打开文件. - 源:System.Deployment - 堆栈跟踪:在System.Deployment.Application.DownloadManager.DownloadDeploymentManifestDirectBypass的System.Deployment.Application.ManifestReader.FromDocument(String localPath,ManifestType manifestType,Uri sourceUri)中(SubscriptionStore子存储,Uri和sourceUri,TempFile和tempFile, System.Deployment.Application.ApplicationActivator上的System.Deployment.Application.DownloadManager.DownloadDeploymentManifestBypass(SubscriptionStore子存储,Uri&sourceUri,TempFile&tempFile,SubscriptionState和subState,IDownloadNotification通知,DownloadOptions选项)中的SubscriptionState&subState,IDownloadNotification通知,DownloadOptions选项,ServerInformation和serverInformation. System.Deployment.Application.ApplicationActivator.ActivateDeploymentWorker上的PerformDeploymentActivation(Uri activationUri,Boolean isShortcut,String textualSubId,String deploymentProviderUrlFromExtension,BrowserSettings browserSettings,String&errorPageUrl)bject state)---内部异常--- System.Deployment.Application.InvalidDeploymentException(SignatureValidation) - 清单XML签名无效. - 来源:System.Deployment …
我坚持使用加密api,因为我对密码术知之甚少.我有这个
XML:
<RSAKeyValue>
<Modulus>1znidPBIcMcO7K/53tkTSyKqxlG5Mcws8kVtijS4tyEU4W/FEVWYpOtv+Stnb4Vt</Modulus>
<Exponent>AQAB</Exponent>
</RSAKeyValue>
Signature:
rNbdUP-p4pEGfwQSwR6VPvAVZ-sZu-ptgw8SofYYmNTlfUB9iUbb593eCAuT5jsqDTC
Original data:
<xml>...some big xml...</xml>
Run Code Online (Sandbox Code Playgroud)
我想验证签名,我该怎么做?
(我正在使用节点v0.10.18)
我正在使用第三方提供的给定XSD的JAXB创建以下XML文档.第三方请求签署文档并向其添加一个包含签名的额外元素.使用JDK 1.7.
以下是编组的代码示例:
JAXBContext jaxbContext = JAXBContext.newInstance(DataPDU.class);
DataPDU myDataPDU = new DataPDU();
myDataPDU.setRevision("2.0.6");
// marshall the file
Marshaller marshaller = jaxbContext.createMarshaller();
DOMResult domResult = new DOMResult();
marshaller.marshal(myDataPDU, domResult);
// get the document list
Document document = (Document) domResult.getNode();
Run Code Online (Sandbox Code Playgroud)
然后我创建元素(LAU)如下,并使用HMAC-SHA256
算法和JSR105 JAVA API 签署文档(我不会包括整个签名代码以减少冗长,我使用XMLSignature
类的标准行为,然后转换使用XML转换器将文档记录到DOMSource的文件输出流中:
Element LAUElement = document.createElementNS("urn:swift:saa:xsd:saa.2.0", "Saa:LAU");
Element rootElement = document.getDocumentElement();
rootElement.appendChild(LAUElement);
// sign the document
XMLSignatureUtil.sign(document, secret, LAUElement, "ds");
// create the output file
TransformerUtil.transformDocumentToFile(document, "resultingFile.xml");
Run Code Online (Sandbox Code Playgroud)
XML正确签名但在验证时,计算的摘要值与摘要值不同.
我注意到在创建LAU元素时更改命名空间值时,摘要永远不会改变,就好像文档正在签名并忽略了LAU元素的命名空间,我想这就是它失败的原因.整个文档中的任何其他更改,或LAU元素前缀的更改都会直接影响计算的有效负载摘要.
如果我将签名直接附加到根元素而不是创建LAU元素,则验证可以正常工作.
LAU元素存在于XSD中,可以使用JAXB创建,但问题是我找不到一种方法来为与根元素分配相同名称空间的前缀(仅在文档中).
问题:
当使用
createElementNS
和将元素添加到文档时,是否实际上从有效负载摘要计算中省略了命名空间appendChild …