首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >crlDistributionPoints dirName

crlDistributionPoints dirName
EN

Stack Overflow用户
提问于 2014-11-14 21:26:30
回答 2查看 975关注 0票数 3

我是pyOpenSSL的新用户,我想用下面的代码做一个认证

代码语言:javascript
复制
from OpenSSL import crypto as c

cert = c.X509()
cert.add_extensions([
    c.X509Extension('crlDistributionPoints', False, 'dirName:/C=US/O=TEST'),
])

这段代码不能工作,有人能帮我吗?pyOpenSSL似乎不支持dirName

代码语言:javascript
复制
cert.add_extensions([
    c.X509Extension('crlDistributionPoints', False, 'URI:http://somesite') can work
])
EN

回答 2

Stack Overflow用户

发布于 2015-08-05 18:56:49

我遇到了完全相同的问题,但是,我也找不到真正的解决方案,我设法通过Python找到了一种变通方法。在本页面中,http://openssl.org/docs/apps/x509v3_config.html#CRL-distribution-points解释了格式化,还提供了一个使用原始DER字节的选项。(部分:任意扩展)

首先从已经具有正确URI和dirName的证书中‘收集’DER字节。用openssl和正确的crlDistributionPoint制作一个证书,这个例子中的tmpcert就是这个证书。还要弄清楚使用了哪个扩展索引。get_short_name会给出扩展的“密钥”,所以搜索crlDistributionPoint。使用以下命令收集数据:

代码语言:javascript
复制
from binascii import hexlify
print tmpcert.get_extension(5).get_short_name()
print hexlify(tmpcert.get_extension(5).get_data())

然后格式化此输出并在X509Extension()的初始化器中使用它。

代码语言:javascript
复制
crypto.X509Extension('crlDistributionPoints', False,  
"DER:30:6a:xx:xx:xx:..........:xx:xx")

正如人们所理解的,这是一个“硬编码”的解决方案,没有直接的方法来改变这个字段的内容。

票数 0
EN

Stack Overflow用户

发布于 2016-05-31 05:32:11

这是一种你可以生成DER的方法。它没有包含dirName的代码,但我希望它能让您了解如何构造DER

代码语言:javascript
复制
from pyasn1.codec.der import encoder as der_encoder
from pyasn1.type import tag
from pyasn1_modules import rfc2459

class GeneralNames(rfc2459.GeneralNames):
    """
    rfc2459 has wrong tagset.
    """
    tagSet = tag.TagSet(
        (),
        tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 0),
        )

class DistributionPointName(rfc2459.DistributionPointName):
    """
    rfc2459 has wrong tagset.
    """
    tagSet = tag.TagSet(
        (),
        tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 0),
        )

cdps = [('uri', 'http://something'), ('dns', 'some.domain.com')]

cdp = rfc2459.CRLDistPointsSyntax()
values = []
position = 0
for cdp_type, cdp_value in cdps:
    cdp_entry = rfc2459.DistributionPoint()

    general_name = rfc2459.GeneralName()

    if cdp_type == 'uri':
        general_name.setComponentByName(
            'uniformResourceIdentifier',
            cdp_value,
            )
    elif cdp_type == 'dns':
        general_name.setComponentByName(
            'dNSName',
            cdp_value,
            )

    general_names = GeneralNames()
    general_names.setComponentByPosition(0, general_name)

    name = DistributionPointName()
    name.setComponentByName('fullName', general_names)
    cdp_entry.setComponentByName('distributionPoint', name)

    cdp.setComponentByPosition(position, cdp_entry)
    position += 1

cdp_der = der_encoder.encode(cdp)

extensions.append(
    crypto.X509Extension(
        b'crlDistributionPoints',
        False,
        'DER:' + cdp_der.encode('hex'),
        ),
    )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26931070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档