【问题标题】:Create arbitrary X509 extensions with M2Crypto使用 M2Crypto 创建任意 X509 扩展
【发布时间】:2014-03-07 11:10:19
【问题描述】:

我有兴趣创建一个包含由 OID 指定的任意扩展的 CSR。理想情况下,我希望该值是 ASN1 编码的实体,尽管将其设置为字符串就足够了。

网上各种例子都指向这样的代码:

extensionStack = X509.X509_Extension_Stack()
extension = X509.new_extension('subjectAltName', 'DNS:example.com')
extensionStack.push(extension)
request.add_extensions(extensionStack)

扩展是从预定义的名称(如subjectAltName)创建的,然后映射到正确的 OID。显然,这些字符串是在objects.txt 中定义的,除了重新编译 OpenSSL 之外,没有办法添加您自己的字符串。

The documentation 表示可以通过编辑openssl.cnf 添加自定义 X509 扩展。但是,我的理解是,这只会影响从命令行调用 OpenSSL 的操作。

如何对 M2Crypto 做同样的事情?换句话说,如何让它或多或少像这样工作?

X509.new_extension('OID:1.2.3.4.5.42', 'test')
#or this
X509.new_extension('OID:1.2.3.4.5.42', '0x1E4...819')

【问题讨论】:

  • "...包含任意扩展的 CSR..." - 尽管您的 CSR 包含它们,但这并不意味着发行者会将它们复制到他们为您发行的证书中。大多数发行人往往对复制和签署的内容相当严格。
  • 确实如此,但这是针对内部开发的系统,因此 CA 将接受并将它们包含在颁发的证书中是事实。
  • 好的,我在问题中错过了。

标签: python x509 m2crypto


【解决方案1】:

你几乎拥有它:

ext = X509.new_extension('1.2.3.4', 
                         'ASN1:UTF8String:Some random data')
# If required: ext.set_critical(1)
cert.add_ext(ext)

它将出现在 OpenSSL 转储中:

                1a:91:ca:bf:aa:ba:3b:49:57
            Exponent: 65537 (0x10001)
    X509v3 extensions:
        X509v3 Subject Alternative Name: 
            DNS:foobar.example.com
        1.2.3.4: 
            ..Some random data
Signature Algorithm: sha1WithRSAEncryption
    18:24:4c:42:fe:7c:71:a6:58:ed:be:9d:2e:9e:ea:a7:80:0f:

不幸的是,M2Crypto 在检索自定义扩展时遇到问题,除非它们首先被注册,并且这些功能目前没有通过 M2Crypto 公开。名称和值将分别返回为“UNDEF”和“None”。

【讨论】:

  • 这行得通,谢谢。我必须承认,在未能找到解决问题的方法后,我通过使用pyasn1 手动创建 ASN1 结构然后使用 M2Crypto 的原语计算签名来解决了这个问题。这很好用,但是男孩……我走了多少弯路……如果其他人有兴趣,这是语法定义:openssl.org/docs/crypto/ASN1_generate_nconf.html#
  • 嗯,我很难找到一种方法来为其提供现有的 DER 编码结构。根据openssl.org/docs/apps/x509v3_config.html#ARBITRARY_EXTENSIONS,这应该可以工作ext = X509.new_extension('1.2.3.4', 'ASN1:DER:010203')。是否必须执行任何技巧来为其提供此类数据?
  • 如果你想跳出 M2Crypto 所构建的一两个与扩展相关的用例,我会假设你会陷入困境。我自己的阻力最小的路径是使用我的 CA 来维护一个证书树,其中包含 subjectAltName 扩展名下的“otherName”UTF8 字符串。我正在使用 pyasn1 来读取扩展(因为 M2Crypto 使用 OpenSSL,并且 OpenSSL 被硬编码以返回otherName 值的文字“不支持”)。我仍在尝试使用 pyasn1... 将 DER 编码的八位字节字符串解码为人类可读
猜你喜欢
  • 2016-10-13
  • 1970-01-01
  • 2015-10-11
  • 2014-06-08
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
相关资源
最近更新 更多