首页 > 解决方案 > 用python生成xml签名的问题

问题描述

我想签署以下名为 example.xml 的 xml

<?xml version='1.0' encoding='ISO-8859-1'?>
  <Ficha version="1.0">
    <Documento ID="F1">
      <Animal>
       <tipo>33</Tipo>
       <raza>1</raza>
       <Fch>2021-02-22</Fch>
     </Animal>
  </Documento>
</Ficha>

我在python中使用以下代码

from lxml import etree
import xml.etree.ElementTree as ET
from signxml import XMLSigner, XMLVerifier
import signxml
import sys

file='example.xml'
uri='F1'
ET.register_namespace('', "http://www.w3.org/2000/09/xmldsig#");

parser = etree.XMLParser(encoding='ISO-8859-1', resolve_entities=False)
el = ET.parse(file,parser)
root = el.getroot()
cert = open("cert.pem").read()
key = open("key.pem").read()

signed_root = XMLSigner(method=signxml.methods.enveloped,
                        signature_algorithm='rsa-sha1',
                        c14n_algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315',
                        digest_algorithm="sha1").sign(root, key=key,cert=cert,reference_uri=uri,always_add_key_value=True)

tree = ET.ElementTree(signed_root)

生成签名,但是...生成的 xml 文件是

 <?xml version='1.0' encoding='ISO-8859-1'?>
    <Ficha xmlns="http://www.w3.org/2000/09/xmldsig#" version="1.0">
        <Documento ID="F1">
                <Animal>
                    <tipo>33</Tipo>
                    <raza>1</raza>
                    <Fch>2021-02-22</Fch>
                </Animal>
    </Documento>
    <Signature>
         .....
         .....
         .....
    </Signature>
    </Ficha>

我想要的是:

 <?xml version='1.0' encoding='ISO-8859-1'?>
        <Ficha version="1.0">
            <Documento ID="F1">
                    <Animal>
                        <tipo>33</Tipo>
                        <raza>1</raza>
                        <Fch>2021-02-22</Fch>
                    </Animal>
        </Documento>
        <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
             .....
             .....
             .....
        </Signature>
        </Ficha>

我在做什么错我需要将属性xmlns="http://www.w3.org/2000/09/xmldsig#" 从 ficha 标签更改为签名标签

标签: pythonxmlsign

解决方案


Ficha 是您的根元素,我认为您使用 .sign(root,.....

我会给签名元素一个变量名并替换

.sign(根...

.sign(signature_variable...


推荐阅读