- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一些 pyOpenSSL 给我的数据,'0\r\x82\x0bexample.com'
。这应该是 subjectAltName X509 扩展名的值。我尝试使用 pyasn1(并基于 pyasn1 示例之一)为此扩展编码 ASN1 规范的必要部分:
from pyasn1.type import univ, constraint, char, namedtype
from pyasn1.codec.der.decoder import decode
MAX = 64
class DirectoryString(univ.Choice):
componentType = namedtype.NamedTypes(
namedtype.NamedType(
'teletexString', char.TeletexString().subtype(
subtypeSpec=constraint.ValueSizeConstraint(1, MAX))),
namedtype.NamedType(
'printableString', char.PrintableString().subtype(
subtypeSpec=constraint.ValueSizeConstraint(1, MAX))),
namedtype.NamedType(
'universalString', char.UniversalString().subtype(
subtypeSpec=constraint.ValueSizeConstraint(1, MAX))),
namedtype.NamedType(
'utf8String', char.UTF8String().subtype(
subtypeSpec=constraint.ValueSizeConstraint(1, MAX))),
namedtype.NamedType(
'bmpString', char.BMPString().subtype(
subtypeSpec=constraint.ValueSizeConstraint(1, MAX))),
namedtype.NamedType(
'ia5String', char.IA5String().subtype(
subtypeSpec=constraint.ValueSizeConstraint(1, MAX))),
)
class AttributeValue(DirectoryString):
pass
class AttributeType(univ.ObjectIdentifier):
pass
class AttributeTypeAndValue(univ.Sequence):
componentType = namedtype.NamedTypes(
namedtype.NamedType('type', AttributeType()),
namedtype.NamedType('value', AttributeValue()),
)
class RelativeDistinguishedName(univ.SetOf):
componentType = AttributeTypeAndValue()
class RDNSequence(univ.SequenceOf):
componentType = RelativeDistinguishedName()
class Name(univ.Choice):
componentType = namedtype.NamedTypes(
namedtype.NamedType('', RDNSequence()),
)
class Extension(univ.Sequence):
componentType = namedtype.NamedTypes(
namedtype.NamedType('extnID', univ.ObjectIdentifier()),
namedtype.DefaultedNamedType('critical', univ.Boolean('False')),
namedtype.NamedType('extnValue', univ.OctetString()),
)
class Extensions(univ.SequenceOf):
componentType = Extension()
sizeSpec = univ.SequenceOf.sizeSpec + constraint.ValueSizeConstraint(1, MAX)
class GeneralName(univ.Choice):
componentType = namedtype.NamedTypes(
# namedtype.NamedType('otherName', AnotherName()),
namedtype.NamedType('rfc822Name', char.IA5String()),
namedtype.NamedType('dNSName', char.IA5String()),
# namedtype.NamedType('x400Address', ORAddress()),
namedtype.NamedType('directoryName', Name()),
# namedtype.NamedType('ediPartyName', EDIPartyName()),
namedtype.NamedType('uniformResourceIdentifier', char.IA5String()),
namedtype.NamedType('iPAddress', univ.OctetString()),
namedtype.NamedType('registeredID', univ.ObjectIdentifier()),
)
class GeneralNames(univ.SequenceOf):
componentType = GeneralName()
sizeSpec = univ.SequenceOf.sizeSpec + constraint.ValueSizeConstraint(1, MAX)
class SubjectAltName(GeneralNames):
pass
print decode('0\r\x82\x0bexample.com', asn1Spec=GeneralNames())
很明显,接近尾声时我有点无聊,没有完全指定 GeneralName
类型。但是,测试字符串应该包含 dNSName
,而不是跳过的值之一,所以我希望它没有关系。
当程序运行时,它失败并出现我无法解释的错误:
Traceback (most recent call last):
File "x509.py", line 94, in <module>
print decode('0\r\x82\x0bexample.com', asn1Spec=GeneralNames())
File "/usr/lib/pymodules/python2.6/pyasn1/v1/codec/ber/decoder.py", line 493, in __call__
length, stGetValueDecoder, decodeFun
File "/usr/lib/pymodules/python2.6/pyasn1/v1/codec/ber/decoder.py", line 202, in valueDecoder
substrate, asn1Spec
File "/usr/lib/pymodules/python2.6/pyasn1/v1/codec/ber/decoder.py", line 453, in __call__
__chosenSpec.getTypeMap().has_key(tagSet):
File "/usr/lib/pymodules/python2.6/pyasn1/v1/type/univ.py", line 608, in getTypeMap
return Set.getComponentTypeMap(self)
File "/usr/lib/pymodules/python2.6/pyasn1/v1/type/univ.py", line 535, in getComponentTypeMap
def getComponentTypeMap(self): return self._componentType.getTypeMap(1)
File "/usr/lib/pymodules/python2.6/pyasn1/v1/type/namedtype.py", line 126, in getTypeMap
'Duplicate type %s in map %s'%(k,self.__typeMap)
pyasn1.error.PyAsn1Error: Duplicate type TagSet(Tag(tagClass=0, tagFormat=0, tagId=22)) in map {TagSet(Tag(tagClass=0, tagFormat=0, tagId=22)): IA5String()}
任何有关我哪里出错以及如何使用 pyasn1 成功解析此扩展类型的提示都将不胜感激。
最佳答案
我在 pyasn1-users 列表上发布了这个问题,Ilya Etingof(pyasn1 的作者)指出了我的错误。简而言之,GeneralName.componentType
中的每个NamedType
都需要被赋予标签信息。这是通过 subtype
方法完成的。例如,而不是:
namedtype.NamedType('rfc822Name', char.IA5String()),
定义应该是:
namedtype.NamedType('rfc822Name', char.IA5String().subtype(
implicitTag=tag.Tag(tag.tagClassContext,
tag.tagFormatSimple, 1))),
其中 1
来自 GeneralName 的 ASN.1 定义:
GeneralName ::= CHOICE {
otherName [0] OtherName,
rfc822Name [1] IA5String,
dNSName [2] IA5String,
x400Address [3] ORAddress,
directoryName [4] Name,
ediPartyName [5] EDIPartyName,
uniformResourceIdentifier [6] IA5String,
iPAddress [7] OCTET STRING,
registeredID [8] OBJECT IDENTIFIER
}
为componentType
的这些字段分别定义标签后,解析成功:
(GeneralNames().setComponentByPosition(
0, GeneralName().setComponentByPosition(1, IA5String('example.com'))), '')
关于python - 如何使用 pyasn1 解析 subjectAltName 扩展数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5519958/
我遇到了与此票证相同的问题,但在过去 5 天内尚未解决,因此与该用户不同,我不确定这是否是 DNS 问题。我发布了我的问题版本,因为另一个问题的答案是“它解决了它自己”(这在我的情况下没有发生)。 H
我们如何删除关于重复问题的错误横幅? 这个问题不是 Why does requestjs reject a self-signed SSL certificate that works with Fi
我目前正在使用以下代码为其他域生成带有 subjectAltName 的 CSR。 $domains = ["example.com", "www.example.com"]; $san = impl
一点点背景 : 我正在构建一个 certificate authority使用 M2Crypto 和 Django,所以请在投票结束前三思而后行! :) 我的方法是最终用户由电子邮件地址识别,他们的自
我已经申请了一个证书(用于 IIS 7 上的 SSL),其中包含多个 subjectAltNames。我读到有些人可能不喜欢这样做,因为公众能够看到不同站点之间的链接。 (这无关紧要,因为证书供内部使
生成的 CSR 是否包含 SubjectAltName 我已将 openssl.cnf 文件配置为支持扩展,当我转储 CSR 时我可以看到主题可用而不是 SubjectAltName CSR就是这样产
我需要使用 pyOpenSSL 从 Python 生成 SSL 证书。有谁知道是否可以设置 subjectAltName?从文档(https://pythonhosted.org/pyOpenSSL/
对于“otherName”的 subjectAltName,OpenSSL 似乎总是显示“不支持”。 写入的字符串(通过 M2Crypto 和直接在命令行通过 openssl.cnf): 1.2.3.
我正在尝试使用 logstash-forwarder 连接到 logstash。他们的通信基于 ssl,所以我生成一个自签名证书如下 this .然后我在 logstash-forwarder 端收到
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我有一些 pyOpenSSL 给我的数据,'0\r\x82\x0bexample.com'。这应该是 subjectAltName X509 扩展名的值。我尝试使用 pyasn1(并基于 pyasn1
我正在创建 CA 证书。我想添加带有一些值的 subjectAltName 扩展名,例如电子邮件或 crl 或公共(public)证书位置等。 package main import ( "c
X509v3 可以包含 IP subject Alternative Name 中的地址字段延期。 作为验证服务器身份的应用程序,应该如何验证IP地址字段? 如果同时存在 DNS 名称和 IP 地址?
我正在尝试使用 DirName 类型的 SubjectAltName 生成自签名证书。其他类型的 SubjectAltName(如 DNS)可以正常工作,但 DirName 将无法正常工作。重现相当简
Chrome 58 弃用了省略主题备用名称 (SAN) 的自签名证书。我使用 Mono.Security.X509 X509CertificateBuilder() 在“本地主机”上为 Windows
我试图抑制以下警告: /usr/lib/python2.7/site-packages/urllib3/connection.py:251: SecurityWarning: Certificate
我正在寻找一种在 IIS 6.0 证书创建向导中的证书请求中添加主题备用名称的方法。看来我只能填写主题字段而不能填写主题备用名称。 尝试使用 certreq.exe 遵循本指南 ( http://su
我刚刚设置了我的第一个需要 ssl 的应用程序。 这是 RoR 应用程序,托管在 Heroku 上。 我已将 SSL Endpoint 插件添加到我的应用程序中。我从 DNSimple 购买了 SSL
我正在尝试从 C++ 代码创建带有 subjectAltName 的自签名请求(尝试将 this 等动态自签名证书实现到实际版本的 OpenResty,但没有针对 subjectAltName 的解决
我是一名优秀的程序员,十分优秀!