如何在xml中插入X509证书签名

时间:2019-06-27 18:28:29

标签: xml certificate x509 sign

我有一个内部带有数据的xml,但是要发送到服务器,我需要它具有x509证书(如果我已经在计算机上安装了该证书)。 问题是,我需要以与以下示例相同的格式插入它,但是我是新手,并且在查看证书的详细信息时,我真的不知道该怎么做。

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:SignedInfo>
        <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
        <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
        <ds:Reference URI="#assinar">
            <ds:Transforms>
                <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                <ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/>
                <ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
                    <ds:XPath>not(ancestor-or-self::ds:Signature)</ds:XPath>
                </ds:Transform>
            </ds:Transforms>
            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
            <ds:DigestValue></ds:DigestValue>
        </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue>
    </ds:SignatureValue>
    <ds:KeyInfo>
        <ds:X509Data>
            <ds:X509Certificate>
            </ds:X509Certificate>
        </ds:X509Data>
        <ds:KeyValue>
            <ds:RSAKeyValue>
                <ds:Modulus>
                </ds:Modulus>
                <ds:Exponent>AQAB</ds:Exponent>
            </ds:RSAKeyValue>
        </ds:KeyValue>
    </ds:KeyInfo>
</ds:Signature>

在我的示例中,<ds:Modulus><ds:X509Certificate><ds:SignatureValue><ds:DigestValue>字段为ASCII格式(我想),但是我的字段为十六进制。

我需要转换吗?发送到一些网址并获得响应?

2 个答案:

答案 0 :(得分:0)

您可以尝试对二进制数据进行base64编码,这就是通过电子邮件附件进行处理的方式。您的API提供程序是否不显示任何示例?

答案 1 :(得分:0)

https://www.w3.org/TR/xmldsig-core1/#sec-X509Data将ds:X509Certificate定义为X.509证书的base64编码。

类似地,https://www.w3.org/TR/xmldsig-core1/#sec-RSAKeyValue将模量和指数描述为CryptoBinary类型。

https://www.w3.org/TR/xmldsig-core1/#sec-CryptoBinary说,正确的编码是将值转换为字节数组,删除所有前导零值字节,然后对它进行base64编码。我可以从经验中说,并非所有平台都删除前导零,并且如果删除了前导零,也不是所有平台都支持读取值。因此,您可以定义要符合的规范。

缺少任何语言标签或代码,最好的答案是所有答案都在XML签名规范中定义:https://www.w3.org/TR/xmldsig-core1/