Python PyOpenSSL:获取一个CRL';s上一次更新和下一次更新字段

Python PyOpenSSL:获取一个CRL';s上一次更新和下一次更新字段,python,openssl,pyopenssl,Python,Openssl,Pyopenssl,我正在尝试使用PyOpenSSL获取CRL的日期。CRL类不将它们作为可访问成员包含。我将浏览所有下划线成员,但我不想使用其中一个,因为它们不应该是“公共的” 有关于日期的建议吗?看来get\u rev\u date() 我在pyOpenSSL上发现了这个功能。该功能目前不存在。 我们最终不得不扩展pyOpenSSL来处理这个问题。pyOpenSSL无法做到这一点,但实际上可以使用PyCrypto的asn1解析器从CRL中提取这些信息,而不会有太多问题。见下例: import types fro

我正在尝试使用PyOpenSSL获取CRL的日期。CRL类不将它们作为可访问成员包含。我将浏览所有下划线成员,但我不想使用其中一个,因为它们不应该是“公共的”


有关于日期的建议吗?

看来
get\u rev\u date()


我在pyOpenSSL上发现了这个功能。

该功能目前不存在。
我们最终不得不扩展pyOpenSSL来处理这个问题。

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日期。

此代码返回列表中单个证书的吊销日期,而不是CRL nextUpdate/lastUpdate字段。您是否计划将此功能的实现贡献给pyOpenSSL项目?如果是这样,OP可能想检查/测试您的代码。以下是的实现(我最终通过python使用openssl命令(“openssl crl-in FILENAME.crl-noout-nextupdate”),并解析输出以获得nextupdate datetime值。这不是最优雅的解决方案…)显然,在OS X上安装PyCrypto需要太多的修改,所以我无法测试代码,但我认为它可以工作。但遗憾的是,目前仍然坚持在服务器上调用“openssl crl…”命令并使用该命令的输出是最容易的。OpenSSL将始终存在于我们的环境中,因此不值得将其替换为非标准库(在我们的情况下)。或者:当我进行Ubuntu 12.04服务器的标准安装时,是否包含PyCrypto?@JoelL,PyCrypto可以从MacPorts轻松安装到OS X上(例如,如果您将MacPorts与python27一起使用,只需运行
sudo-port安装py27-crypto
),Ubuntu上也提供了该功能(
apt-get-install-python-crypto