Здравствуйте. Пытаюсь реализовать встроенную подпись XMLDSIG на python.
Требуется подписать всё, что внутри тега <Package>

template.xml
(3kb) загружен 0 раз(а).Если я передаю в метод signed_xml.Sign() второй параметр xpath со значением "//Package[1]" или тем, что в переменной package_signature_xpath, то получаю ошибку "The parameter is incorrect. (0x80070057)".
Если передаю только один параметр signer, то получаю корректную подпись, но подписывается весь документ, как я понимаю. При попытке проставить вторую подпись, то первая подпись становится невалидной.
Подскажите, как правильно передавать xpath или как верно формировать шаблон подписи, чтобы подписывался только тег <Package>, чтобы можно было его подписать несколькими подписями, которые оставались бы валидными?
def sign_xml(self, xml_data):
"""
Подписание XML данных
:param xml_data: XML данные для подписи (bytes)
:return: Подписанные XML данные (bytes)
"""
if not isinstance(xml_data, bytes):
raise XMLSignerError("XML данные должны быть в формате bytes")
try:
certificate = self._get_certificate()
signer = pycades.Signer()
signer.Certificate = certificate
signer.CheckCertificate = True
signed_xml = pycades.SignedXML()
signed_xml.Content = xml_data.decode('utf-8')
# signed_xml.SignatureType = pycades.CADESCOM_XML_SIGNATURE_TYPE_ENVELOPED
signed_xml.SignatureType = pycades.CADESCOM_XML_SIGNATURE_TYPE_TEMPLATE
package_signature_xpath = ("/*[local-name()='PackageSchema' and namespace-uri()='']"
"/*[local-name()='Package' and namespace-uri()='']")
signature = signed_xml.Sign(signer)
return signature.encode('utf-8')
except Exception as e:
raise XMLSignerError(f"Ошибка при подписании XML: {str(e)}")