问题的解决方法是在进行第一次调用之前,首先调用“load_pem_x509_certificate”,然后尝试对使用“cms.ContentInfo”的代码进行调用。这将使asn1crypto正确处理内容并避免出现问题。
代码示例:
from asn1crypto.x509 import Certificate
from asn1crypto.cms import ContentInfo
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa
# Generate RSA key pair
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
)
public_key = private_key.public_key()
# Create certificate
subject = issuer = cert_attrs = x509.Name.build({
'common_name': 'test.example.com',
})
builder = x509.CertificateBuilder(
issuer_name=issuer,
subject_name=subject,
serial_number=x509.random_serial_number(),
not_valid_before=datetime.utcnow(),
not_valid_after=datetime.utcnow() + timedelta(days=10),
)
builder = builder.add_extension(
x509.BasicConstraints(ca=False, path_length=None), critical=True,
)
cert = builder.sign(
private_key=private_key, algorithm=hashes.SHA256(),
backend=default_backend()
)
# Serialize certificate and load back
crypto_cert = serialization.load_pem_certificate(
cert.public_bytes(serialization.Encoding.PEM),
backend=default_backend()
)
asn1_cert = Certificate.load(cert.public_bytes(serialization.Encoding.DER))
# Create ContentInfo and serialize/deserialize
ci1 = ContentInfo({
'content_type': 'data',
'content': b'test123'
})
der1 = ci1.dump()
ci2 = ContentInfo.load(der1)
ci3 = ContentInfo.load(der1)
ci4 = ContentInfo.load(der1)
# Evaluating ContentInfo after loading ASN.1 certificate
asn1crypto.patch_asn1crypto()
asn1_cert.dump()
ci5 = ContentInfo.load(der1)