问题标签 [xml-dsig]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2319 浏览

c# - 在 xml 签名文件中拆分 base64 签名值

我正在尝试签署一些 XML 文件,我设法做得很好,但我找不到检查签名的方法,接收器服务很好地接受它(xml),但它在签名上发现错误。

我检查了 Web 服务的文档,他们说,签名值每行最多可以有 76 个字符,每次加载或编辑 xml 文件时我都必须保留.whitespace。

这是我的 xml 文件一旦输出(我编辑了一些安全值)puu.sh/d6lwC/25eb2a0d02.png (请注意两个签名值如何是没有空格的长行。

这就是我认为它应该看起来的样子:puu.sh/d6lCV/48b0cc0cd7.png

这是应该按照服务文档的 xml 文件:puu.sh/d6ltJ/bd8e25a4b4.png

这是我的签名代码

我的问题是:

如何在不损坏 xml 本身的其他核心值的情况下轻松拆分签名值的行,从而使 web 服务能够正确读取和验证 xml 文件的签名?

在此先感谢,并原谅我蹩脚的英语。

编辑:我发现了这个问题 https://stackoverflow.com/questions/24916486/how-to-do-envelope-rsa-sha1-digital-signature-of-xml-data-using-php

他以某种方式设法通过 php 将 base64 值按块和 76 长度与此代码拆分来解决我的问题

我怎样才能用 c# 实现这一点?

0 投票
1 回答
10384 浏览

c# - 如何在 C# 中验证 XML 文件的签名(不是证书文件)?

我正在为政府计费系统编写一些代码,在阅读了几个星期后,我走到了死胡同。

我需要验证从服务器收到的 xml 文件中的至少两个签名,当我是使用 cert 文件或 x509store 签名的人时,我基于公共 MSDN 编写了一些代码来验证签名,并且工作正常,我可以根据他们的参考毫无问题地签署和验证每个签名。

但是,当我收到文件时,我不知道如何验证它,因为我没有证书文件,我当然知道里面有标签,如果我得到那个值并将它放在 openssl.exe 我可以验证签名者的身份,但不知道如何检查签名是否正确

http://puu.sh/dypRH/c45e200202.png

过去我用过

现在我尝试 signedXml.CheckSignature())

每次都失败,我无法参考要选择的签名,所以我做了一个 for

但他们仍然失败

我还根据xml文件制作了证书,

验证,但也失败了

我现在真的不知道该怎么办,我有点绝望,这是xml文件

http://puu.sh/dyqcv/356dd289ae.xml

我需要验证签名,在此之后我必须制作一个响应文件并将其发送回服务器(它已准备好但由于我无法验证签名我不想继续)

哦,是的,我在签名检查/计算之前删除了命名空间并线性化了所有内容

我真的很感激各种帮助,即使是我应该在哪里尝试的一点点也会有所帮助。

哦,对不起,但我真的检查了所有网站,我希望这个问题不会重复,上次我真的被猛烈抨击并失去了我所有的代表:(

但我有足够的动力再问一次

https://stackoverflow.com/questions/27158035/replace-string-with-another-string-does-not-work

我受此苦

问候!

编辑:根据 user409104 的要求,这是整个文件的签名值(三个中的第一个),它也包括签名节点和 keyinfo 值

我已经根据xml文件创建了这个密钥,但我无法选择选择哪个,我猜它使用第一个找到的,(但xml中有3个)也不知道如何使用它来验证。

我不能用 RSAKeyValue 制作 x509certificate/2 对吗?

0 投票
1 回答
938 浏览

xml - XML-DSIG 中的 URI 和摘要计算

我正在分析一个 XML-DSIG 文件,以便了解如何编写生成 XML-DSIGnatures 的软件代码。我遇到了这个麻烦,迫切需要帮助......我试图从 signatures0.xml 中理解这一点(在这一点之后引用):

签名0.xml:

据我了解,第一个引用位是指同一文件中的SignedPropertiesElem_0元素。我试图准确地确定它指的是什么——应该选择哪段代码并稍后用于规范化,然后计算摘要值。是不是这个:

或这个:

或这个:

还是它的其他部分?

我尝试了第一个,然后让它通过 StylusStudio 规范化或http://www.soapclient.com/xmlcanon.html(两者似乎都返回相同的结果),结果如下:

然后使用这些工具计算摘要值: http ://www.webutils.pl/index.php?idx= sha1 hash.online-convert.com/sha256-generator www.freeformatter.com/message-digest.html#广告输出

它们都返回了相同的结果,但该结果与 xml 文件中的结果不同:kOlNXyBs6oSP9hbh+4niZMNQ9OsOCzYhkSYYG4YdHQU=

我究竟做错了什么?我应该将 xml 文档的哪一部分复制并粘贴到规范化程序中,然后再粘贴到摘要计算器中?我花了几天时间尝试不同的事情并寻找答案,但一无所获……我确定我错过了一些东西,因此我寻求您的帮助。

0 投票
1 回答
264 浏览

soap - 使用 com.ibm.crypto.provider.RSAPrivateCrtKey 进行 WS 安全签名

我正在使用 CXF ws secuirty 创建客户端以将 WS 安全 SOAP 信封发送给第三方。当我从本地 Tomcat 服务器发送请求时,我收到 200 响应,但是,当我部署到 websphere 时,我收到 500 响应。我比较了 Tomcat 和 Websphere 的信封和日志。一切都匹配(签名算法、签名提供者、X509 证书)。当我与第三方交谈时,他们说 RSA 签名无效。我能找到的唯一区别是“用密钥签名”日志。在 websphere 上,密钥似乎由不同的包提供。这是问题吗?如果是这样,我该如何解决?

Websphere 日志:

Tomcat 日志(我删除了一些值):

0 投票
2 回答
1501 浏览

java - 使用 JAXB 处理数字签名的命名空间

人们,

我已经阅读了此处的帖子和使用 JAXB 时处理数字签名的示例代码,并且遇到了一个问题,我认为这是通过 JAXB 编组将名称空间引入“SignedInfo”元素的问题。

我已经定义了一个 XSD,它将被以不同编程语言实现的多个应用程序使用。我将 XSD 编译为 JAXB 注释类以供我的实现使用(Jersey JAX-RS 和 JAX-WS)。我目前的流程如下:

  1. JAXB 对象是使用适当的数据创建的或从远程应用程序交付的。
  2. Blaise Doughan所述,将 JAXB 分配到 DOM 以进行签名。
  3. 使用创建封装签名的私钥签署 DOM。
  4. 将 DOM 解组到 JAXB 以用于 JAX-RS/WS 消息传递。

我被迫在我的 XSD 定义中的父元素末尾添加一个“xsd:any”元素,以便 DOM 到 JAXB 解组工作,否则嵌入的“签名”元素被删除。我还让 JAXBContext 知道 xmldsig 命名空间。

以下步骤顺序有效:JAXB -> DOM -> 签名 -> 验证

所以我知道签名工作正常。但是,以下序列验证失败:JAXB -> DOM -> 签名 -> JAXB -> DOM ->Validate

经过一些测试和阅读后,我的猜测是 JABX Marshaller 对“SignedInfo”的修改导致了问题,因为它为所有 xmlsig 元素添加了命名空间前缀。

这是 DOM 生成的 XML(缩写):

这是从 JAXB 编组后的元素(ns2 在父元素中定义):

我的假设是否正确,这是验证失败的原因?

有没有办法在使用 JAXB 时保持“签名”元素不变?

是否有一个 CanonicalizationMethod 会忽略计算中的任何命名空间前缀?

此外,如果要更改已签名 XML 中的命名空间前缀,这是否也会导致验证失败(例如,从 ns1 更改为 abc)?我想知道如果其他应用程序序列化/反序列化 XML 并可能更改命名空间前缀,数字签名是否会失效?

感谢您的任何帮助!

约翰

0 投票
1 回答
549 浏览

hash - XML-DSIG 的 SignatureValue 计算

我正在尝试编写一个方法,该方法使用C++/CLI 中的NET 框架组件( RSACryptoServiceProvider )返回 XMLDSIG 的 XML 元素的签名。请有人用更简单的话解释一下 XMLDSIG 规范(http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/)的这段摘录,因为我的编程和数学背景很少,因此有难以理解这一点 - 或者提供一个真实代码的摘录作为实现这一点的示例?

RSA 签名的 SignatureValue 内容是根据 RFC 2437 [PKCS1,第 8.1.1 节:RSASSA-PKCS1-v1_5 签名方案的签名生成]计算的八位字节字符串的 base64 [MIME] 编码。如 EMSA-PKCS1-V1_5-ENCODE 函数 RFC 2437 [PKCS1,第 9.2.1 节] 中规定的,输入到签名函数的值必须包含哈希函数的前置算法对象标识符,但 ASN 的可用性.1 签名验证者不需要解析器和 OID 识别。PKCS#1 v1.5 表示形式显示为: CRYPT (PAD (ASN.1 (OID, DIGEST (data)))) 请注意,填充的 ASN.1 将采用以下形式:01 | FF* | 00 | 前缀 | 散列在哪里“|” 是串联,“01”、“FF”和“00” 是对应十六进制值的固定八位字节,“hash”是数据的 SHA1 摘要,“prefix”是 PKCS1 [RFC 2437] 中要求的 ASN.1 BER SHA1 算法指示符前缀,即 hex 30 21 30 09 06 05 2B 0E 03 02 1A 05 00 04 14 包含此前缀是为了更容易使用标准加密库。FF 字节必须重复最大次数,以使被 CRYPTed 的量的值比 RSA 模数短一个字节。

换句话说,如果我有某个 XML 元素的哈希值(不是用 base64 编码的,对吗?),在将它发送到SignHash(在RSACryptoServiceProvider中)函数之前我该怎么做?我知道它在文本中,但我很难理解它。我根本不理解“CRYPT (PAD (ASN.1 (OID, DIGEST (data))))”,虽然我理解其中的一部分......我不明白获取 OID 和 ASN 的方法以及如何填充它...

0 投票
0 回答
324 浏览

.net - 验证签名时 SignedXml 无法正常工作

是 Microsoft使用SignedXml类验证签名的示例,由于在代码中将XmlNode转换为XmlElement,它对我不起作用(在 Visual Studio 2013 和 .NET 版本 4.0 中):

“不起作用”是指即使我删除了引用的文件(那些在签名 XML文件中的引用中引用的文件),它也没有抛出任何异常。这意味着它只是没有检查它们。

但是当我以这种方式初始化signedXml时:

它在找不到引用文件时抛出异常并在找到所有引用文件时返回“真实”值(因为签名是正确的)完美地工作。

这意味着在将 XmlNode 转换为 XmlElement 时会发生错误,即使(即使它确实返回了我需要的节点)。我什至尝试用 XmlWriter 编写它并得到了我需要的东西。

问题是我需要将XmlNode 转换为 XmlElement的方式,因为我正在使用的 XML 文件在树的下方有一个Signature元素(也就是说,它不是根节点),我需要使用SelectSingleNodeGetItemByTagName . 我该如何解决这个问题?

0 投票
1 回答
917 浏览

xml - 究竟要在 XMLDSIG 上消化和签署什么以及如何?(或者,OSX 原生客户端与服务器上计算的 XMLDSIG 不匹配)

我正在尝试使用封装签名、sha1 摘要和 rss-sha1 签名按照 XMLDSIG 规范签署 xml 文档,并且服务器不断返回“297 - 拒绝:签名与计算的 [结果] 不匹配”(“297 - Rejeicao : Assinatura difere do calculado”巴西葡萄牙语原文)

我的客户端应用程序需要是 Mac OS X 原生的(所以 Objective-C 和 Swift)。我遵守 Apple 的 CryptoCompatibility 指南并使用 Security.framework 的 SecSignTransform 和 CommonCrypto 的 CC_SHA1。

这是我正在尝试使用 XMLDSIG 的 XML(没有 PrettyPrint 并省略了术语以节省空间):

不幸的是,由于 .Net 和 Java 都为 XMLDSIG 提供了非常高级的支持,因此有关获取 XML 的哪些部分、保留哪些内容以及删除哪些内容的详细信息在 Internet 上很少见。除了 W3.org 自己的规格非常枯燥之外,我发现的唯一深入解释是:http ://www.di-mgt.com.au/xmldsig2.html

我不确定不匹配是在 sha1 摘要还是 rsa-sha1 签名中,返回码不清楚。另外,我不知道我是否使用了错误的输入,或者我使用的 Mac OS X 库是否与服务器(基于 .Net)不兼容。

这是摘要的代码。请注意它使用同文档 URI 引用:

代码中使用的额外方法:

在计算摘要后,将其插入到预先格式化的签名 XML 字符串中,以创建 XML 文档,然后提取 SignedInfo 节点并用于生成 SignatureValue:

据我所知,一切都是正确的,并且符合 W3.org 的 XMLDSIG 规范。尽管如此,服务器总是拒绝生成的 XML。

我无计可施。任何帮助和智慧将不胜感激!!

0 投票
2 回答
1567 浏览

xml-dsig - 使用 xmlsec1 的 XML 签名

我尝试使用以下命令使用 P12 私钥签署我的测试 xml,并收到以下错误:

有什么建议吗?

0 投票
2 回答
2420 浏览

.net - 从 X509Certificate2 获取 X509SerialNumber 整数值

我正在尝试获取 X509.v3 证书(我作为 X509Certificate2 对象)的序列号,以将其放入XADES XMLDSIG 中的X509SerialNumber元素中,该元素应该是一个整数。我有一个由其他软件使用我正在使用的证书制作的 XML 签名,这是它的序列号:

不幸的是,我无法从使用用于签署上述 XML 的证书初始化的 X509Certificate2 对象中获取此值。这些是我得到的价值

我认为GetSerialNumber()返回一个Base64String。如您所见,GetSerialNumber()GetSerialNumber()返回不同的值。从这些值中获取值“1315010063538360283821765366094690”的整数的方法是什么?