我是pyOpenSSL的新用户,我想用下面的代码做一个认证
from OpenSSL import crypto as c
cert = c.X509()
cert.add_extensions([
c.X509Extension('crlDistributionPoints', False, 'dirName:/C=US/O=TEST'),
])这段代码不能工作,有人能帮我吗?pyOpenSSL似乎不支持dirName
cert.add_extensions([
c.X509Extension('crlDistributionPoints', False, 'URI:http://somesite') can work
])发布于 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。使用以下命令收集数据:
from binascii import hexlify
print tmpcert.get_extension(5).get_short_name()
print hexlify(tmpcert.get_extension(5).get_data())然后格式化此输出并在X509Extension()的初始化器中使用它。
crypto.X509Extension('crlDistributionPoints', False,
"DER:30:6a:xx:xx:xx:..........:xx:xx")正如人们所理解的,这是一个“硬编码”的解决方案,没有直接的方法来改变这个字段的内容。
发布于 2016-05-31 05:32:11
这是一种你可以生成DER的方法。它没有包含dirName的代码,但我希望它能让您了解如何构造DER
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'),
),
)https://stackoverflow.com/questions/26931070
复制相似问题