0

我正在尝试使用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>

我不明白要签名的文档是由URIXML 模板中的属性引用的,但我不明白如何引用xmlSecDSigCtxxmlsec1 库使用的文档。

在封装签名示例中,只有一个文档传递给了 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 版本。

4

0 回答 0