Я использую библиотеку signxml , чтобы подписать простой XML:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?> <Shopping xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <Fruit id="themessage"><Apples/><Bananas/><Pears/></Fruit> </Shopping>
Однако он не создает тег ds: Transforms в подписи:
<Shopping xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:Signature> <ds:SignedInfo> <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2006/12/xml-c14n11"/> <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> <ds:Reference URI="#themessage"> <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <ds:DigestValue>+dOniegeY2BGpuaAZJpPxQXqaLE=</ds:DigestValue> </ds:Reference> </ds:SignedInfo> <ds:SignatureValue>z4J(...)</ds:SignatureValue> <ds:KeyInfo> <ds:X509Data><ds:X509Certificate>MII(...)</ds:X509Certificate><ds:X509Data> </ds:KeyInfo> </ds:Signature> <Fruit id="themessage"><Apples/><Bananas/><Pears/></Fruit> </Shopping>
Мне нужно создать тег ds: Transforms, например:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?> <Shopping xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:Signature> <ds:SignedInfo> <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2006/12/xml-c14n11"/> <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> <ds:Reference URI="#themessage"> <ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2006/12/xml-c14n11"/></ds:Transforms> <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <ds:DigestValue>euMQ45LHLFbno1j/WTA6Tpf0mxM=</ds:DigestValue> </ds:Reference> </ds:SignedInfo> <ds:SignatureValue>MGJ(...)
Код похож на:
data = etree.parse(sys.argv[1]).getroot() remove_signature(data) signer = XMLSigner(method=methods.detached, signature_algorithm="rsa-sha1", digest_algorithm="sha1", c14n_algorithm="http://www.w3.org/2006/12/xml-c14n11") signature = signer.sign(data, reference_uri="themessage", key=key, cert=crt) data.insert(0, signature)
Я читаю ключ и сертификат из файлов.
В чем проблема?
Разве signxml не поддерживает преобразования?
Чего мне не хватает?