我有一个XML文档,需要在其中验证签名。SignedInfo元素具有指定算法“http://www.w3.org/2001/10/xml-exc-c14n#”的元素CanonicalizationMethod,还具有一个子元素InclusiveNamespaces,该子元素具有填充的PrefixList属性,如下所示:
<ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="soapenv"></ec:InclusiveNamespaces>
</ds:CanonicalizationMethod>...
我使用以下代码创建我的C14Transform对象:
XmlDsigExcC14NTransform cn14Transform = new XmlDsigExcC14NTransform(false, "soapenv");
其中“soapenv”
来自prefixlist
属性。
<ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="soapenv"></ec:InclusiveNamespaces>
</ds:CanonicalizationMethod>
...
我遇到的问题是在规范化时未包含xmlns:soapenv=“...”
部分,导致签名验证失败。
我可以通过编程方式插入它来解决这个问题,但这是一个麻烦,因为会有前缀列表内容的变化。
也许Microsoft的这篇文章可以帮助您:https://support.Microsoft.com/en-us/kb/2639079
它们向您展示了如何注册规范化算法的自定义转换。它是用来移除一个名称空间的,但我认为你也可以用这个来添加一个。
public class MyXmlDsigExcC14NTransform : XmlDsigExcC14NTransform
{
public MyXmlDsigExcC14NTransform() {}
public override void LoadInput(Object obj)
{
XmlElement root = ((XmlDocument)obj).DocumentElement;
if (root.Name == "SignedInfo") root.RemoveAttribute("xml:id");
base.LoadInput(obj);
}
}
在应用程序开始时,可以使用以下调用注册MyXmlDsigExcC14NTransform:
CryptoConfig.AddAlgorithm(typeof(MyXmlDsigExcC14NTransform), "http://www.w3.org/2001/10/xml-exc-c14n#");
我正在尝试用Itext 5和BouncyCastle 1.48验证PDF签名。我的代码适用于许多已签名的pdf,但也适用于特定客户的某些pdf。这是我的Java代码 有时我会遇到这样的例外: JAVAlang.IllegalArgumentException:getInstance:org中的未知对象。蹦蹦跳跳。asn1。Asn1在组织中列举。蹦蹦跳跳。asn1。ASN1序列。组织上的getIns
我被这件事困扰了一段时间。我已经了解了如何从EC公钥字节中获取公钥对象?方法这是他的例子,但不是我的。不知道哪里出了问题。该示例在节点上工作。但是当使用公钥、消息和ECC椭圆签名时,它总是返回false。 如果有人能帮忙,我将不胜感激。热情问候。 以下是在节点上创建的:
我正在尝试用Itext 5.4和BouncyCastle 1.49验证PDF签名(它是通过Adobe Reader X用我的数字证书手动签名的)。 但是验证结果总是出乎意料的,下面是我的Java代码: 控制台显示:完整性检查OK?真
我无法使用Crypt::RSA和Crypt::RSA::SS::PSS在Perl中验证PSS签名。 字符串“hello”是由设备签名的缓冲区。 “pubkey.pem”是设备的RSA公钥,用PEM_write_RSA_PUBKEY()从设备导出。 “hello.sig”包含由设备生成的二进制(原始)签名。(因为有填充,所以是128字节。) 我试图在Perl中使用crypt::rsa和crypt::