【问题标题】:Using M2Crypto to save and load X509 certs in pem files使用 M2Crypto 在 pem 文件中保存和加载 X509 证书
【发布时间】:2010-04-28 00:04:40
【问题描述】:

我希望如果我有一个 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))

【问题讨论】:

  • 您是否尝试将 tcs 保存在文件中?您收到的文件是否与 cs_cert 完全相同?如果你有相同的文件,那么在第一次 save_pem 中进行了某种数据转换。如果两个文件不同,您将能够转储文件的包含(使用 OpenSSL 实用程序或使用 CertUtil.exe -dump),并查看同一证书的两个版本有什么不同。
  • 我没有费心尝试将 tcs 保存在文件中。由于 tcs 已经没有针对我签署 cs 的证书进行验证(不是在这个例子中,而是在导致我最终发现这个问题存在的原始代码中),再次将 tcs 保存回文件并没有真正帮助我。无论如何,从我读过的关于 pem 文件和 x509 证书的所有内容来看,具有不同 pem 表示形式的证书应该具有不同的文本表示形式。另外,请注意示例中证书的文本是相同的(根据 m2 和 openssl),但 pem 文件不是。因此我很困惑。

标签: python cryptography x509certificate m2crypto pem


【解决方案1】:

如果您使用 OpenSSL 命令行工具创建的证书(例如,测试目录中的 server.pem 没有密钥和文本)通过加载并使用 M2Crypto 保存它来尝试此操作,您应该得到相同的文件。

我认为 contrib 目录中的 SimpleX509Create.py 工作方式不同,但我对其进行了测试,并且遇到了与您发现的相同的问题。显然,我们缺少 OpenSSL 命令行工具所做的一些步骤。

【讨论】:

  • 它确实适用于 OpenSSL 创建的证书。是否有针对此问题我应该遵循的错误或我应该提交错误的地方?谢谢。
  • 它确实适用于 OpenSSL 创建的证书。是否有针对此问题我应该遵循的错误或我应该提交错误的地方?请注意,从文件加载的证书并未使用 m2 创建的证书所使用的相同 CA 证书进行验证,因此这不仅仅是一个表面问题。谢谢。
  • 您可以在 M2Crypto 上提交错误:chandlerproject.org/Projects/MeTooCrypto#Bugzilla%20database
猜你喜欢
  • 2012-04-05
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
相关资源
最近更新 更多