Использование M2Crypto для сохранения и загрузки сертификатов X509 в файлы pem - PullRequest
1 голос
/ 28 апреля 2010

Я ожидаю, что если у меня есть сертификат X509 в качестве объекта в памяти, сохраните его как файл pem, а затем загрузите его обратно, я получу тот же сертификат, с которого я начал. Похоже, что это не так. Давайте назовем исходный сертификат A, а сертификат, загруженный из файла pem B. A.as_text () идентичен B.as_text (), но A.as_pem () отличается от B.as_pem (). По меньшей мере, я смущен этим. В качестве дополнительного примечания: если A был подписан другой сущностью C, то A проверит на наличие сертификата C, а B - нет.

Я собрал крошечный пример программы, чтобы продемонстрировать, что я вижу. Когда я запускаю это, возникает второй RuntimeError.

Спасибо
Брок

#!/usr/bin/python2.6

import M2Crypto as m2
import time

cur_time = m2.ASN1.ASN1_UTCTIME()
cur_time.set_time(int(time.time()) - 60*60*24)

expire_time = m2.ASN1.ASN1_UTCTIME()
# Expire certs in 1 hour.
expire_time.set_time(int(time.time()) + 60 * 60 * 24)


cs_rsa = m2.RSA.gen_key(1024, 65537, lambda: None)
cs_pk = m2.EVP.PKey()
cs_pk.assign_rsa(cs_rsa)
cs_cert = m2.X509.X509()

# These two seem the minimum necessary to make the as_text function call work
# at all
cs_cert.set_not_before(cur_time)
cs_cert.set_not_after(expire_time)

# This seems necessary to fill out the complete cert without errors.
cs_cert.set_pubkey(cs_pk)

# I've tried with the following set lines commented out and not commented.
cs_name = m2.X509.X509_Name()
cs_name.C = "US"
cs_name.ST = "CA"
cs_name.OU = "Fake Org CA 1"
cs_name.CN = "www.fakeorg.dex"
cs_name.Email = "cs1@www.fakeorg.dex"
cs_cert.set_subject(cs_name)
cs_cert.set_issuer_name(cs_name)
cs_cert.sign(cs_pk, md="sha256")

orig_text = cs_cert.as_text()
orig_pem = cs_cert.as_pem()

print "orig_text:\n%s" % orig_text

cs_cert.save_pem("/tmp/foo")

tcs = m2.X509.load_cert("/tmp/foo")

tcs_text = tcs.as_text()
tcs_pem = tcs.as_pem()

if orig_text != tcs_text:
        raise RuntimeError(
            "Texts were different.\nOrig:\n%s\nAfter load:\n%s" %
            (orig_text, tcs_text))

if orig_pem != tcs_pem:
        raise RuntimeError(
            "Pems were different.\nOrig:\n%s\nAfter load:\n%s" %
            (orig_pem, tcs_pem))

1 Ответ

1 голос
/ 28 апреля 2010

Если вы попробуете это с сертификатом, который вы создали с помощью инструментов командной строки OpenSSL (например, server.pem в каталоге тестов без ключа и текста), загрузив и сохранив его с помощью M2Crypto, вы должен получить идентичные файлы.

Я думал, SimpleX509Create.py в каталоге contrib работал по-другому, но я проверил его, и у меня возникла та же проблема, которую вы обнаружили. Очевидно, что нам не хватает какого-то шага, который делают инструменты командной строки OpenSSL.

...