标签: xml-signature

C中的XML签名验证库?

C语言中是否有可用的库来验证XML签名?我只能从http://santuario.apache.org/cindex.html找到一个C++库.

c xml verification xmlsec xml-signature

5
推荐指数
1
解决办法
2313
查看次数

如何在C#中使用XmlDsigC14NTransform类

我试图通过使用System.Security.Cryptography.Xml.XMLDsigC14nTransformc#.net Framework 2.0类来规范化xml节点。

该实例需要三种不同的输入类型,即NodeList,Stream和XMLDocument。我尝试使用所有这些输入类型进行转换,但是得到了不同的结果。我真正想做的是规范化单个节点,但是正如您在输出文件中看到的那样,输出不包含任何内部xml。

非常感谢有关规范XML节点的正确方法的任何建议。最好,

string path = @"D:\Test\xml imza\sign.xml";
XmlDocument xDoc = new XmlDocument();
xDoc.PreserveWhitespace = true;
using (FileStream fs = new FileStream(path, FileMode.Open))
{
    xDoc.Load(fs);
}

// canon node list
XmlNodeList nodeList = xDoc.SelectNodes("//Child1");

XmlDsigC14NTransform transform = new XmlDsigC14NTransform();
transform.LoadInput(nodeList);
MemoryStream ms = (MemoryStream)transform.GetOutput(typeof(Stream));

File.WriteAllBytes(@"D:\Test\xml imza\child1.xml", ms.ToArray());

// canon XMLDocument
transform = new XmlDsigC14NTransform();
transform.LoadInput(xDoc);
ms = (MemoryStream)transform.GetOutput(typeof(Stream));

File.WriteAllBytes(@"D:\Test\xml imza\doc.xml", ms.ToArray());

// Document to Stream
ms = new MemoryStream();
XmlWriter xw = XmlWriter.Create(ms);
xDoc.WriteTo(xw);
xw.Flush();
ms.Position …
Run Code Online (Sandbox Code Playgroud)

c# xml canonicalization xml-signature

5
推荐指数
1
解决办法
6847
查看次数

使用OpenSAML和OpenSSO进行签名验证问题

我们在服务提供商网站上使用OpenSAML为我们的客户提供SSO.我们的客户(ID提供商)正在使用OpenSSO.OpenSSO发布的SAML响应在签名元素方面略有不同,因为它不受命名空间限定.这似乎与OpenSAML相关并且它从samlResponse.getSignature()方法返回null ,因此我无法验证签名.

导致问题的SamlReponse的签名片段

<Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <SignedInfo>
        <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
        <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
        <Reference URI="#s2d10cccbd58d1f78c2c76c74c82a236548c929ffd">
            <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>j+KBoDOtEcyCquPTxRCXoBulStQ=</DigestValue>
        </Reference>
    </SignedInfo>
    <SignatureValue>Dv+owuZfGFymGGrw2gHA3/7GVC6mXt8JMW+tOvmtnjTRJZaDE+Nb2NCngio1Tnqu4LWnvVrry4Wk... 6QcIJi/kGc4YFMSQj/Q=</SignatureValue>
    <KeyInfo>
        <X509Data>
            <X509Certificate>MIIEhDCCA+2gAwIBAgIQXxhipi2wpPxWi7MTVfFVHDANBgkqhkiG9w0BAQUFADCBujEfMB0GA1UE... 78Q/lRQuBhHMy02lKctnwjBeEYA=</X509Certificate>
        </X509Data>
    </KeyInfo>
</Signature>
Run Code Online (Sandbox Code Playgroud)

来自另一个可用的SAML响应的签名片段

<dsig:Signature xmlns="http://www.w3.org/2000/09/xmldsig#" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
    <dsig:SignedInfo>
        <dsig:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
        <dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
        <dsig:Reference URI="#id-TtLltjcBSOAJ6OipumUEj8o0Qag-">
            <dsig:Transforms>
                <dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                <dsig:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </dsig:Transforms>
            <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <dsig:DigestValue>5c95zhA139qzMvZA2A445F3LWaU=</dsig:DigestValue>
        </dsig:Reference>
    </dsig:SignedInfo>
    <dsig:SignatureValue>JsmRFJn1CjClHs4rf0hrwKzOq6ZtmnOEm/PNiaJvYurko/ZP+PApWhk55x0unIVwZ6XDv3k8Dj81WqUl07J0Dkvzp71bccIgiGTRzoNPT71nBAXxJmZiXz51JWctg13zjxP0oQMSpWytKCrFkCkJ0So3RQl3WixYV3miK0YjJnM=</dsig:SignatureValue>
    <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    </ds:KeyInfo>
</dsig:Signature>
Run Code Online (Sandbox Code Playgroud)

如您所见,OpenSSO服务器中的签名片段不包含SAML绑定规范中指定的命名空间限定符.

对我来说,最后一个选项是对发布的SAMLResponse进行一些按摩,以便将命名空间添加到签名元素中,以使OpenSAML库工作.

关于如何使用OpenSAML库解决这个问题的任何想法都受到高度赞赏.

在此先感谢CJ

xml opensso signature saml xml-signature

5
推荐指数
1
解决办法
2907
查看次数

使用xml中的公钥进行javax.xml.crypto.dsig验证

使用javax.xml.crypto.dsig,如何在不指定公钥的情况下解组和验证XMLSignature?公钥似乎是在签名的xml中,但我无法找到一种方法来获取它.

DOMValidateContext valContext = new DOMValidateContext(key,signatureNode);
XMLSignature signature = fac.unmarshalXMLSignature(valContext);
boolean coreValidity = signature.validate(valContext);
Run Code Online (Sandbox Code Playgroud)

据我所知,有必要将KeySelector而不是Key传递给DOMValidateContext.但是,我无法弄清楚如何实现KeySelector.

这是我发现的关于如何实现KeySelector的唯一示例:http: //download.oracle.com/javase/6/docs/technotes/guides/security/xmldsig/XMLDigitalSignature.html

不幸的是它不起作用.在该实现中,它执行以下操作但总是失败,因为没有KeyValue元素(看起来它们是org.jcp.xml.dsig.internal.dom.DOMX509Data元素而不是KeyValue元素,它们无法通过他们的关键).

List list = keyInfo.getContent();

for (int i = 0; i < list.size(); i++) {
    XMLStructure xs = (XMLStructure) list.get(i);
    if(xs instanceof KeyValue) {
        PublicKey pk = null;
        try {
            pk = ((KeyValue) xs).getPublicKey();
        } catch (KeyException ke) {
            throw new KeySelectorException(ke);
        }
        // make sure algorithm is compatible with method
        if (algEquals(sm.getAlgorithm(), pk.getAlgorithm())) {
            return new SimpleKeySelectorResult(pk);
        }
    }
} …
Run Code Online (Sandbox Code Playgroud)

java xml-signature

5
推荐指数
1
解决办法
4271
查看次数

Java等效于C#XML签名方法

我编写了以下.NET Framework 3.5 C#方法,该方法获取XML文档的位置和X509数字证书(带有私钥)的对象表示,并将XML文档作为嵌入了XML签名(XMLDsig)的对象返回作为根的第一个子元素。

事实是,我迫切需要能够使用Java SE 6执行完全相同的过程,但是我很久没有编写任何Java了,也不知道从哪里开始。

谁能在Java代码中提供产生完全相同的 XML输出的等效方法?

private static XmlDocument SignXmlDocument(string xmlFilePath, X509Certificate2 certificate)
{
    // load xml from disk preserving whitespaces
    XmlDocument xmlDocument = new XmlDocument { PreserveWhitespace = true };
    xmlDocument.Load(xmlFilePath);

    // create signed xml with a same-document reference containing an enveloped-signature transform
    SignedXml signedXml = new SignedXml(xmlDocument) { SigningKey = certificate.PrivateKey };
    Reference reference = new Reference { Uri = "" };
    XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();            
    reference.AddTransform(env);
    signedXml.AddReference(reference);

    // embed public key information …
Run Code Online (Sandbox Code Playgroud)

c# java xml signature xml-signature

5
推荐指数
1
解决办法
4391
查看次数

是否有理由在XAdES上使用CAdES进行高级电子签名?

我无法找到任何理由为什么有人愿意在面向XAdES的应用中实施面向CAdES的电子签名软件解决方案.

互联网上有更多开放的库和实施案例以及XAdES的例子,但我不相信这就是为什么人们决定在CAdES上使用XAdES的原因.

是因为XAdES是面向XML的,软件开发人员喜欢与XML相关的任何东西吗?是否有任何情况下CAdES完全是使用XAdES的最佳选择?

谢谢!

以供参考:

  • CAdES是高级形式的CMS/PKCS#7(支持时间戳)
  • XAdES是高级形式的XML-DSig(支持时间戳)

xml electronic-signature content-management-system xml-signature pkcs#7

5
推荐指数
2
解决办法
2929
查看次数

Java中的XMLSignature中的DigestValue与C#不同

我有一个在C#中运行的程序,它将XMLSignature应用于xml文档.我在两种情况下(C#和Java)都有相同的XML文档,但我没有得到相同的摘要和签名值.我知道我的C程序的结果是正确的,但我不能在Java中正确地得到它们.

这里是C#代码:

      public void SignXml(XmlDocument xmlDoc, RSA Key)
        {
            // Check arguments.
            if (xmlDoc == null)
                throw new ArgumentException("xmlDoc");
            if (Key == null)
                throw new ArgumentException("Key");

            // Create a SignedXml object.
            SignedXml signedXml = new SignedXml(xmlDoc);

            // Add the key to the SignedXml document.
            signedXml.SigningKey = Key;

            // Create a reference to be signed.
            Reference reference = new Reference();
            reference.Uri = "";

            // Add an enveloped transformation to the reference.
            XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
            reference.AddTransform(env);

            // Add the reference …
Run Code Online (Sandbox Code Playgroud)

c# java xml-signature

5
推荐指数
1
解决办法
4954
查看次数

如何通过xml签名文件提取"原始"内容

我正在处理XML签名.如您所知,XML签名有三种类型:封装,封装,分离.

我找到了很好的教程,关于如何使用java标准API来签名/验证文件,但我想知道如何提取(几乎)"原始"内容数据.特别是:

1)验证一个Enveloped XML签名文件后,没有签名"获取"XML内容的正确方法是什么?

2)验证Enveloping XML签名文件后,"获取""对象"节点的正确方法是什么?

对于"get",我的意思是写在一个单独的物理文件上,清理签名(如果可能,使用标准API).

先感谢您,

亲切.

米尔科

java xml digital-signature envelope xml-signature

5
推荐指数
1
解决办法
2130
查看次数

如何验证HTTP重定向绑定的SAML签名

我通过HTTP重定向绑定收到SAML请求,SAML请求的内容如下所示

{ "SigAlg"=> " http://www.w3.org/2000/09/xmldsig#rsa-sha1 ", "SAMLRequest"=>"lVLLaoQwFP0VyT5jEqPG4AiFoSDMtNApXXQzxDxaQRObRDqfX3XoolAKXd7DPQ/uuXUQ4zDxo3tzc3zSH7MOMWkPe3DpcixzVVVQl4RBqoiCncEYEmkoY7k00hCQvGgfemf3gOwQSNoQZt3aEIWNC4RwCRGGiD6jkmPMs2KHUPYKksPi0lsRN + Z7jFPgafqpvejtbtQpSK7jYAPfsu3B7C13IvSBWzHqwKPk57vTkS + WfPIuOukG0NSbub9R/yaJELRfzUGzrhmtFut15qdeeheciY926K2u05toUz8sIu0huXd + FPFv9RXpFTTbKp/WA4WobQT/jEYrykwhNaQ66yDNMwY7wijEtMCmysqqo6xOb8Ga + tbjWYe1jtYqfW0uCucoYwWCHS3F0kRGoajWTpAiiJRZJRmu01 Y3 + CPt2i + AA =="}

它还具有Signature值

WkDaGzC6vPTlzh + EnFA5/8IMmV7LviyRh2DA5EHF0K0nl + xzBlKfNCYRnunpwoEvGhereGdI5xBpv + mc9IguiCaLZSZjDh6lIDdpvctCnmSNzORqzWQwQGeZ9vjgtCLjUn35VZLNs3WgEqbi2cL + ObrUDS2gV1XvBA3Q3RRhoDmi + XE89Ztnd1cNpR3XdA + EL2ENbMI2XAD9qSgMufUJY/3GBBpT7Vg1ODtPxBudq + sXrgPh/+ + WtUUitLkkfC8tdRTCS1EZPv h27I5g/VNza23Xl8w2HdAuYP0F2FjREo8VV2aUtaOUd/jAF9 + bfkGV93y1PzFttLxdBbFoxp6qBg ==

但我不明白如何验证此签名是否正确.

有关SAML绑定的第3.4.4.1节https://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf

To construct the signature, a string consisting of the concatenation of the RelayState (if present),
SigAlg, and SAMLRequest (or SAMLResponse) query string parameters (each one URLencoded)
is constructed in one of the following ways …
Run Code Online (Sandbox Code Playgroud)

xml saml-2.0 xml-signature itfoxtec-identity-saml2

5
推荐指数
1
解决办法
7936
查看次数

接收方未能验证签名的 XML 消息

我正在尝试根据为我们的测试应用程序提供给我们的规格表使用 C# 签署一些 XML。我们必须:

  1. 规范化消息。
  2. 使用摘要算法创建整个消息的摘要。
  3. 将摘要添加到 Signed Info 元素。
  4. 规范化签名信息。
  5. 将私钥和规范化的签名信息输入指定的签名算法以生成数字签名。
  6. 将生成的数字签名添加到签名元素。

这就是我目前所拥有的。

public static XmlElement Sign(XmlDocument msgDoc)
{
    XmlDsigExcC14NTransform transform = new XmlDsigExcC14NTransform();
    transform.LoadInput(msgDoc);
    msgDoc.Load(transform.GetOutput() as Stream);

    var signedXml = new SignedXml(msgDoc)
    {
        SigningKey = Certificate.GetRSAPrivateKey(),
    };

    signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;

    var reference = new Reference();
    reference.AddTransform(new XmlDsigEnvelopedSignatureTransform(true));
    reference.AddTransform(new XmlDsigC14N11Transform()); // Custom transform
    reference.Uri = string.Empty;
    reference.DigestMethod = SignedXml.XmlDsigSHA256Url;

    signedXml.SignedInfo.AddReference(reference);

    KeyInfo keyInfo = new KeyInfo();
    var keyInfoData = new KeyInfoX509Data();
    keyInfoData.AddIssuerSerial(CertManager.Certificate.Issuer, CertManager.Certificate.SerialNumber);
    keyInfoData.AddSubjectName(CertManager.Certificate.Subject);
    keyInfo.AddClause(keyInfoData);
    signedXml.KeyInfo = keyInfo;

    signedXml.ComputeSignature();
    XmlElement …
Run Code Online (Sandbox Code Playgroud)

c# xml cryptography signing xml-signature

5
推荐指数
1
解决办法
646
查看次数