Криптография Python: обновить существующий CRL дополнительными отозванными сертификатами - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь добавить дополнительные сертификаты в существующий CRL, используя криптографический проект Python: https://cryptography.io/

Глядя на документы для построителя CRL Я не вижу способачтобы загрузить существующий CRL, добавьте с помощью add_revoked_certificate(revoked_certificate), а затем отмените CRL.

В документах для add_revoked_certificate(revoked_certificate) указано:

revoked_certificate - экземпляр RevokedCertificate.Их можно получить из существующего CRL или создать с помощью RevokedCertificateBuilder.

Это заставляет меня поверить, что не существует готового способа обновления CRL на месте, но я просто хотел быть уверен, что яя не пропускаю что-то.

Для чего он стоит, мой текущий код такой, как показано ниже, и я вставил псевдокод в качестве комментариев к тому, что я пытаюсь сделать.

def revoke_cert(cert_revocation_list_pem, cert_pem):
    # Load CRL
    cert_revocation_list = x509.load_pem_x509_crl(
        cert_revocation_list_pem.encode("ascii"), default_backend()
    )

    # Load cert
    cert = x509.load_pem_x509_certificate(cert_pem.encode("ascii"), default_backend())

    # Create a revoked cert
    builder = x509.RevokedCertificateBuilder()
    builder = builder.revocation_date(datetime.today())
    builder = builder.serial_number(cert.serial_number)
    revoked_cert = builder.build(default_backend())

    # I want to do something like this
    #cert_revocation_list.append(revoked_cert)

    return cert_revocation_list.public_bytes(encoding=serialization.Encoding.PEM)

Как всегда, спасибо за любую помощь!

РЕДАКТИРОВАТЬ:

Я закончил тем, что добавил третий аргумент, чтобы принять список сертификатов для отзыва.

def build_crl(cert_authority_pem, private_key_pem, certs_to_revoke=None):
    # Load our root cert
    root_cert = x509.load_pem_x509_certificate(
        cert_authority_pem.encode("ascii"), default_backend()
    )

    # Load our root key
    root_key = serialization.load_pem_private_key(
        private_key_pem.encode("ascii"), password=None, backend=default_backend()
    )

    builder = x509.CertificateRevocationListBuilder()
    builder = builder.last_update(datetime.today())
    builder = builder.next_update(datetime.today() + timedelta(1, 0, 0))
    builder = builder.issuer_name(root_cert.issuer)
    if certs_to_revoke:
        for revoked_cert in certs_to_revoke:
            builder = builder.add_revoked_certificate(revoked_cert)
    cert_revocation_list = builder.sign(
        private_key=root_key, algorithm=hashes.SHA256(), backend=default_backend()
    )
    return cert_revocation_list.public_bytes(encoding=serialization.Encoding.PEM)
...