Знак xmlsec1 работает в командной строке, но не работает в коде Python

Я пытаюсь подписать XML-файл, используя pyxmlsec/xmlsec/libxml2, но это не удается (sigCtx->signValueNode == NULL:error=100:assertion).

Когда я бегу из командной строки, это работает гладко:

xmlsec1 sign --output signed.xml --pkcs12 c.pfx --pwd mypwd tobesigned.xml

Мой код Python:

libxml2.initParser()
libxml2.substituteEntitiesDefault(1)
xmlsec.init()
xmlsec.cryptoAppInit(None)
xmlsec.cryptoInit()

doc_xml = libxml2.parseMemory(xml, len(xml))
signature_node = xmlsec.findNode(
    doc_xml.getRootElement(),
    xmlsec.NodeSignature,
    xmlsec.DSigNs,
)

signer = xmlsec.DSigCtx()

key = xmlsec.cryptoAppKeyLoad(
    filename=str(self.issuer.certificate.path),
    format=xmlsec.KeyDataFormatPkcs12,
    pwd=str(self.issuer.certificate_password),
    pwdCallback=None,
    pwdCallbackCtx=None,
)

signer.signKey = key
signer.sign(signature_node) # error!
...

Полная трассировка ошибок:

func=xmlSecDSigCtxProcessSignatureNode:file=xmldsig.c:line=463:obj=unknown:subj=dsigCtx->signValueNode == NULL:error=100:assertion:
func=xmlSecDSigCtxSign:file=xmldsig.c:line=303:obj=unknown:subj=xmlSecDSigCtxSigantureProcessNode:error=1:xmlsec library function failed: 

Какие-нибудь советы?

Спасибо!

1 ответ

Решение

xmlsec был скомпилирован с опцией -DXMLSEC_NO_SIZE_T, а pyxmlsec с -UXMLSEC_NO_SIZE_T.

Отредактируйте setup.py и добавьте следующую строку после t = tuple(flag[2:].split('='))

   if len(t) == 1: t = tuple([t[0],""])

Хорошо работает после исправлений.

Обязательно очистите, восстановите и переустановите!

Другие вопросы по тегам