我正在使用库 signxml 签署 XML 签名以进行 SAML 身份验证。我们的实施者合作伙伴之一要求我们以 SHA1 形式发送签名。 XMLSigner 的基本配置不支持 SHA1,因为 SHA1 不安全,因此它已被弃用。不幸的是,我仍然必须将其作为 SHA1 发送,因为其他实现者不会更改他们的代码库。我已阅读库文档,但不确定如何强制 SHA1 支持。如果您在下面调用此代码,则会在代码中的此时出错:https://github.com/XML-Security/signxml/blob/9f06f4314f1a0480e22992bbb8209a71bc581e05/signxml/signer.py#L120
signed_saml_root = XMLSigner(method=signxml.methods.enveloped, signature_algorithm="rsa-sha1", digest_algorithm="sha1", c14n_algorithm="http://www.w3.org/2001/10/xml-exc-c14n#")\
.sign(saml_root, key=self.key, cert=self.cert, always_add_key_value=True)
verified_data = XMLVerifier().verify(signed_saml_root, x509_cert=self.cert).signed_xml
文档提到要对 SHA1 弃用执行以下操作:基于 SHA1 的算法在数字签名中使用并不安全。包含它们只是为了兼容旧版本,并且默认情况下处于禁用状态。要验证基于 SHA1 的签名,请使用:
XMLVerifier().verify(
expect_config=SignatureConfiguration(
signature_methods=...,
digest_algorithms=...
)
)
但这只是寻求验证,不确定如何使其在签名上起作用。有人可以提供一些关于如何让 SHA1 与 signxml 库一起使用的建议吗?
您可以覆盖
source中的函数
check_deprecated_methods
来传递错误。
from signxml import XMLSigner
class XMLSignerWithSHA1(XMLSigner):
def check_deprecated_methods(self):
pass
现在,您可以使用类
XMLSignerWithSHA1
来签名:
signer = XMLSignerWithSHA1(signature_algorithm=SignatureMethod.RSA_SHA1, digest_algorithm=DigestAlgorithm.SHA1)
signed = signer.sign(data, cert=cert, key=key)