4

PyOpenSSL を使用して CRL の日付を取得しようとしています。CRL クラスには、それらがアクセス可能なメンバーとして含まれていません。私はすべてのアンダースコア メンバーを調べていますが、「パブリック」であってはならないので、それらの 1 つを使用したくありません。

日付を取得するための提案はありますか?

4

3 に答える 3

5

pyOpenSSL ではそれを行うことはできませんが、CRL からのこの情報は、実際には PyCrypto の asn1 パーサーを使用して問題なく抽出できます。以下の例を参照してください。

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 の日付を抽出するだけです。

于 2012-12-13T02:21:10.610 に答える
0

get_rev_date()その日付をASN1 GENERALIZEDTIMEとして返すようです。

これはpyOpenSSLのドキュメントで見つけました。

于 2012-12-07T17:40:31.623 に答える
0

機能は現在存在しません。これを処理するために pyOpenSSL を拡張する必要がありました。

于 2012-12-10T21:07:06.750 に答える