我正在尝试使用xmlsec1 library
在 XML 文档上执行分离签名。我已经执行了一个信封签名,所以我对图书馆的工作原理有了基本的了解。
我有两个 XML 文档,第一个代表要签名的文档(只是一个例子):
<?xml version="1.0" encoding="UTF-8"?>
<Data>Hello, World!</Data>
第二个是分离的签名模板:
<?xml version="1.0" encoding="UTF-8"?>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#hmac-sha256" />
<Reference URI="#Data">
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
<DigestValue></DigestValue>
</Reference>
</SignedInfo>
<SignatureValue/>
<KeyInfo>
<KeyName/>
</KeyInfo>
</Signature>
我不明白要签名的文档是由URI
XML 模板中的属性引用的,但我不明白如何引用xmlSecDSigCtx
xmlsec1 库使用的文档。
在封装签名示例中,只有一个文档传递给了 sign 方法:
xmlDocPtr doc = NULL;
xmlNodePtr node = NULL;
xmlSecDSigCtxPtr dsig_ctx = NULL;
doc = xmlParseDoc( (const unsigned char*)xml_doc );
node = xmlSecFindNode( xmlDocGetRootElement( doc ), xmlSecNodeSignature, xmlSecDSigNs );
dsig_ctx = xmlSecDSigCtxCreate( NULL );
// Key management skipped
xmlSecDSigCtxSign( dsig_ctx, node );
注意:我在 Linux 18.04 上使用 1.2.32 xmlsec1 版本。