私が消費しようとしている SOAP Web サービスでは、次のような構造の XML を送信する必要があります。
<?xml version="1.0"?>
<TheData>
<Father Id="zzz">
<SomeInfo>1</SomeInfo>
<List>
<ElementOfList>
<Child Id="foo">foo</Child>
<Signature>
...
</Signature>
</ElementOfList>
<ElementOfList>
<Child Id="bar">bar</Child>
<Signature>
...
</Signature>
</ElementOfList>
</List>
</Father>
<Signature>
...
</Signature>
</TheData>
<Signature>
内容は次のとおりです。
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<Reference URI="#[the _Id_ attr of this Signature's sibling element]">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>uCMzpgMnLCP9iESFQVgpmtQ5TRE=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>...</SignatureValue>
<KeyInfo>
<X509Data>
<X509Certificate>...</X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
どうすればいいですか?
xmlsec1 --id-attr:Id Father --id-attr:Id Child
フィールドが空白のファイルを渡して試していますSignature
が、最初のフィールドしか埋めません。
また、子に単独で署名して、それを父のテンプレートに入れて、父に署名しようとしましたがxmlsec1
、2 番目の要素を無視します (そして、最初の署名の値を変更します。その要素内にカプセル化されるはずではありませんでしたか? )。
関係ないかもしれませんが、どなたか教えてください。
むしろ Python コード内からこれを行いたいのですが、使用しようとした 3 つのライブラリ、python-xmlsec、pyxmlsec、およびxmldsigはすべて、 の属性を生成/再認識できませんでしURI
た<Reference>
。おそらく の が欠けているためでしょうが、--id-attr
私xmlsec1
が得ているこれらの問題は、私がこの XML 署名のことを本当に理解していないという事実を明らかにしています。私がそれを理解するのを手伝ってください。
編集
これらの XML 署名の問題に苦労している人はたくさんいるようですが、同じ XML ファイル内の 2 つの異なる要素に署名しようとしている人はいません。このケースはw3C Scenarios FAQにもリストされていません。これは、私の Web サービスが複数の署名を必要とするため、すべてが奇妙に見えます。それともしませんか?彼らが公開しているスキーマは次のとおりです: https://github.com/proge/PyNFSe/blob/master/pysped_nfse/nfse.xsd#L539 (この要素<xsd:element name="EnviarLoteRpsEnvio">
と子を参照)。