【发布时间】:2012-12-04 01:59:51
【问题描述】:
我正在尝试使用 PyOpenSSL 获取 CRL 的日期。 CRL 类不包含它们作为可访问成员。我正在遍历所有下划线成员,但我宁愿不使用其中之一,因为它们不应该是“公共的”。
有什么关于约会的建议吗?
【问题讨论】:
我正在尝试使用 PyOpenSSL 获取 CRL 的日期。 CRL 类不包含它们作为可访问成员。我正在遍历所有下划线成员,但我宁愿不使用其中之一,因为它们不应该是“公共的”。
有什么关于约会的建议吗?
【问题讨论】:
使用 pyOpenSSL 无法做到这一点,但实际上可以使用 PyCrypto 的 asn1 解析器提取 CRL 中的这些信息,而不会出现太多问题。请参见下面的示例:
import types
from Crypto.Util import asn1
import datetime as dt
from pytz import UTC
def decode_time(obj, format):
return dt.datetime.strptime(obj.payload, format).replace(tzinfo=UTC)
time_formats = {
23: lambda(obj): decode_time(obj, "%y%m%d%H%M%SZ"),
24: lambda(obj): decode_time(obj, "%Y%m%d%H%M%SZ"),
}
def crl_dates(crl_der):
crl_seq = asn1.DerSequence()
crl_seq.decode(crl_der)
if len(crl_seq) != 3: raise ValueError("unknown crl format")
tbsCertList = asn1.DerSequence()
tbsCertList.decode(crl_seq[0])
thisUpdate = asn1.DerObject()
nextUpdate = asn1.DerObject()
if isinstance(tbsCertList[0], types.StringTypes): # CRL v1
thisUpdate.decode(tbsCertList[2])
nextUpdate.decode(tbsCertList[3])
else:
if tbsCertList[0] > 1: raise ValueError("unsupported CRL profile version: %d" % tbsCertList[0])
thisUpdate.decode(tbsCertList[3])
nextUpdate.decode(tbsCertList[4])
if thisUpdate.typeTag not in time_formats or \
nextUpdate.typeTag not in time_formats:
raise ValueError("invalid CRL date/time fields")
return time_formats[thisUpdate.typeTag](thisUpdate), \
time_formats[nextUpdate.typeTag](nextUpdate)
if __name__ == '__main__':
from urllib2 import urlopen
print "CRL v1", crl_dates(urlopen("http://crl.verisign.com/pca1.1.1.crl").read())
print "CRL v2", crl_dates(urlopen("http://www.gstatic.com/GoogleInternetAuthority/GoogleInternetAuthority.crl").read())
注意:此代码不检查任何签名或类似的东西,只是提取 CRL 日期。
【讨论】:
sudo port install py27-crypto),也可以在 Ubuntu 上使用 (apt-get install python-crypto)跨度>
看来get_rev_date() 会将该日期返回为ASN1 GENERALIZEDTIME。
我在 pyOpenSSL 的 documentation 上找到了这个。
【讨论】:
该功能目前不存在。 我们最终不得不扩展 pyOpenSSL 来处理这个问题。
【讨论】: