问题标签 [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 回答
2728 浏览

c# - .Net 4.0 C# 加载 SHA256 密钥 SignatureAlgorithm 时更改为 SHA1

我现在整整一个星期都在为此苦苦挣扎,希望有人可以帮助我。

我需要使用 SHA256 和 xmldsig 对 xml 进行签名。为此,我使用 SignedXML 类。在查看此类时,我看到它使用加载键的 SignatureAlgorithm 值来确定要使用的散列类型。

无论我如何加载密钥(通过证书存储或通过加载证书文件),它都会将 SHA1 显示为 SignatureAlgorithm。当我在 MMC 证书存储中查找我的证书的详细信息时,它显示 SHA256 作为 SignatureAlgorithm。

我尝试了 openssl 和 makecert 来生成一个 SHA256 证书密钥,但是两者都将在 .Net 中加载为 SHA1 所以 signedXml.ComputeSignature(); 将使用 SHA1 作为 SignatureMethod

.Net 4.0 应该支持 SHA256 吧?

0 投票
1 回答
77 浏览

xml - 是什么阻止我将自己的签名添加到事物中?

我在理解数字签名方面缺少一些东西,希望有人能为我解决。

数字签名是为了验证某些东西没有被修改并且来自一个人。

所以说我以某种方式截获了一个带有签名的xml文件。我撕掉签名,然后对文件进行一些编辑。然后我为这个文件生成一个新的签名,并将它发送给它要去的人。他们检查了参考,是的,它检查了。该文件未被篡改。但它是,只有签名也被篡改了。这一定是不可能的,所以,我在这个谜题中缺少了什么巨大的部分?

0 投票
1 回答
1263 浏览

c# - C# 为什么 XmlDsigC14NTransform 从 xml 中删除所有空格

我对 XmlDsigC14NTransform 有疑问。我试图重复来自 http://www.di-mgt.com.au/xmldsig2.html的示例(部分组成规范化的 SignedInfo 元素并计算其 SignatureValue),但我的代码从 xml 中丢失了空格,我无法获得正确的 hexdump。

我的 C# 代码:

源 Xml(来自文件 C:\temp\new_sign.txt):

我如何将空格保存到我的 xml 中并像示例(http://www.di-mgt.com.au/xmldsig2.html)中那样获得规范化的 xml?

0 投票
0 回答
816 浏览

ruby - 使用 Ruby on Rails 从 SiteMinder 验证 XML 签名

我在验证由 SiteMinder 使用 Ruby on Rails xmldsig gem 创建的 XML 签名文档时遇到问题。我克隆了 gem 并用调试器运行了它,我找不到任何错误。它都失败了[:digest_value, :signature]。但是,这个在线工具说 XML 是有效的(但证书不受信任): http ://www.globaltrustfinder.com/XMLSignatureVerificationStep1.aspx

这个在线工具说 XML 无效:http ://www.aleksey.com/xmlsec/xmldsig-verifier.html

抱歉,我无法发布 XML,因为它包含电子邮件地址,如果已签名,将它们取出也无济于事。但这里是<ds:Signature> http://pastebin.com/CxYkgBhx

我尝试从命令行运行 xmlsec1,但它无法正确安装。

我试图验证 XMLSpy 中的文档,但它说Canonical XML of type 'http://www.w3.org/2001/10/xml-exc-c14n#' is not supported?!

0 投票
1 回答
1035 浏览

xml - XmlDSig:参考处理模型(节点集与八位字节流)

我正在学习XML 高级电子签名

要创建“ArchiveTimeStamp”(第 58 页),规范说:

根据 XMLDSIG 的引用处理模型处理检索到的 ds:Reference 元素。

如果结果是 XML 节点集,则对其进行规范化。(...)

参考处理模型结束于此:

该过程使用“URI=...”和“ds:Transforms”来检索数据。

以下是从( 4.3.3.2 参考处理模型)中摘录的部分内容:

URI 解引用或后续转换结果的数据类型是八位字节流或 XPath 节点集。(...)

在本规范中,'same-document' 引用被定义为一个 URI-Reference,它由一个井号 ('#') 和一个片段组成,或者由一个空 URI (...)

除非 URI-Reference 是这样的“相同文档”引用,否则取消引用 URI-Reference 的结果必须是八位字节流。特别是,由 URI 标识的 XML 文档不会被签名应用程序解析,除非 URI 是同一文档引用,或者除非应用了需要 XML 解析的转换。

以下示例演示了 URI 属性标识的内容以及取消引用的方式:

URI="http://example.com/bar.xml"
标识八位字节 (...)

URI="http://example.com/bar.xml#chapter1"
标识外部 XML 资源 (...) 的 ID 属性值为“chapter1”的元素,以八位字节流的形式提供。(...)

URI=""
标识节点集 (...)

URI="#chapter1"
标识包含 (...) 的节点集

这个问题。

对于这些参考:

结果 1#: ( <file> ... childs ... <file>)。不应用摘要转换

结果 2#:( xml with exc-c14n)。不应用摘要转换

结果 3#:(只有具有 exc-c14n 的孩子<child_1/>...<child_x/>没有应用摘要转换。这不是要解析的有效 XML 文件,没有单个根。但可以在 fakefile.xml 上下文中使用“节点集”。

结果(1#、2# 和 3#)是“八位字节流”吗?

因为: 除非 URI-Reference 是这样的“相同文档”引用,否则取消引用 URI-Reference 的结果必须是八位字节流。

或者它们是 XML 高级电子签名规范化所需的“XML 节点集”?

因为: (...) 特别是,除非 URI 是同文档引用或应用了需要 XML 解析的转换,否则签名应用程序不会解析由 URI 标识的 XML 文档。

或者(除非应用需要 XML 解析的转换)仅在参考上下文中有效并且结果是八位字节流?

欢迎文章。

0 投票
1 回答
4169 浏览

java - Java X509证书颁发者验证

我正在使用 X509Certificates 实现通信,并且正在努力验证证书。

我得到了一个自签名的“父”证书,用于签署所有其他证书。

这已经完成,我已经获得了证书。

在下一步中,另一部分是签署我的证书并存储它们。

这是第一个问题:我返回的证书与我创建的证书不对应,因此公钥不同。我现在如何使用签名证书更新我的密钥库?因此,我需要证书中的私钥,但我需要返回证书中的签名版本。

下一个问题:签名证书需要根据父证书进行验证和检查,但是这样做时,如下所示:

它抛出,签名错误,java.security.SignatureException:签名不匹配。

还有其他方法可以检查发行者或验证证书吗?有什么我错过的吗?

最好的,亨里克

0 投票
1 回答
2093 浏览

c# - .NET 中的 SignedXML 问题

我正在尝试使用数字签名对 XML 文档进行签名。我安装了证书并且输出似乎类似于规范(除了命名空间,这似乎是我在 .NET 中无法触及的东西),但是我无法获得我发送的 WebService 来接受这个,它返回错误:

VerifyXml:验证失败:签名无效

我无法控制此 WebService,并且此服务的供应商声称其他人对此 WebService 没有任何问题。

我也试过使用这个验证工具:

http://www.aleksey.com/xmlsec/xmldsig-verifier.html

返回错误:数据不匹配:签名不匹配,因此,我想我做错了什么。

我的代码如下所示:

我曾尝试在 .NET 中验证 SignedXML,这似乎可以验证,但由于它是它所用的语言,因此我对此不太信任。

我的规范如下所示:

我在做一些明显错误的事情吗?我不确定命名空间在签署 XML 方面有多重要,但由于这似乎是一个 .NET “一成不变”,我怀疑这可能是它吗?

0 投票
1 回答
3792 浏览

c# - 使用 PHP 对 XML 文件进行数字签名

我需要使用私有 RSA 密钥对 XML 文件进行签名,以便使用我的 C# 应用程序进行验证。当我使用我的 C# 应用程序签署 xml 时,这是最终输出:

登录 C#:

我怎样才能在 PHP 中做同样的事情?

0 投票
1 回答
1169 浏览

xml - 如何签署各种 XML 元素并签署它们的父元素?

在我尝试使用的 SOAP Web 服务中,有必要发送具有类似于以下结构的 XML:

其中<Signature>有内容:

我该怎么做?

我正在尝试xmlsec1 --id-attr:Id Father --id-attr:Id Child,将字段为空白的文件传递给它Signature,但它只填充其中的第一个。

我还尝试单独签署孩子,将其放在父亲模板中,他们试图签署父亲,但xmlsec1忽略第二个元素(并更改第一个签名的值 - 它不应该封装在其元素中吗? )。


可能无关,但谁知道呢?

我宁愿从 Python 代码中执行此操作,但是我尝试使用的三个库python-xmlsec、pyxmlsecxmldsig无法生成/重新调整. 可能是因为他们缺少of ,但是我得到的这些问题揭示了一个事实,即我并不真正理解这些 XML 签名的东西,因此,我做错了事情并把它搞砸了。请帮助我理解它。URI<Reference>--id-attrxmlsec1


编辑

我似乎有很多人在这些 XML 签名主题方面遇到困难,但没有人试图在同一个 XML 文件中签署两个不同的元素。w3C 场景常见问题解答中也没有列出这种情况,这让一切看起来都很奇怪,因为我的网络服务需要我多重签名。或者不?这是他们发布的架构:https ://github.com/proge/PyNFSe/blob/master/pysped_nfse/nfse.xsd#L539 (请参阅此元素<xsd:element name="EnviarLoteRpsEnvio">和子元素)。

0 投票
1 回答
2651 浏览

c# - SignedXml.CheckSignature 仅在我使用私钥验证时才返回 true

我见过几个类似的问题,但没有一个能完全解决我的问题。

我正在尝试对 XML 进行签名,然后使用 C# 使用公钥对其进行验证。

我使用密钥对 XML 进行签名,然后将密钥导出到 XML。然后将密钥和签名的 XML 带到另一台计算机,使用 导入密钥rsa.FromXmlString(doc.InnerXml),并验证 XML 签名。

如果我将公钥和私钥都导出到 XML 使用rsa.ToXmlString(True). 但是,我只想使用 . 导出我的公钥rsa.ToXmlString(False)。如果我只导出公钥并将其导入第二台计算机并尝试验证 XML 签名,则表示签名无效。

首先,我应该能够仅使用公钥来验证签名的 XML 吗?

其次,如果这是真的,为什么我的验证 XML 函数只适用于 pub/priv 密钥对而不是只适用于公钥?

您对如何调试此问题有任何智慧吗?我不确定还能做什么,因为signedXml.CheckSignature(Key);没有提供任何有关失败原因的信息。

我的导入密钥、导出密钥、签署 XML 和验证 XML 功能如下。如果您需要更多信息,请与我们联系。