我有一个内部带有数据的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格式(我想),但是我的字段为十六进制。
我需要转换吗?发送到一些网址并获得响应?
答案 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/。