我試圖使用PyOpenSSL獲取CRL的日期。 CRL類不包含它們作爲可訪問的成員。我正在瀏覽所有下劃線成員,但我不想使用其中的一個,因爲它們不應該是「公開」的。PyOpenSSL:獲取CRL的最後更新和下一次更新字段
關於獲取日期的任何建議?
我試圖使用PyOpenSSL獲取CRL的日期。 CRL類不包含它們作爲可訪問的成員。我正在瀏覽所有下劃線成員,但我不想使用其中的一個,因爲它們不應該是「公開」的。PyOpenSSL:獲取CRL的最後更新和下一次更新字段
關於獲取日期的任何建議?
看來get_rev_date()
將返回該日期爲ASN1 GENERALIZEDTIME。
我在pyOpenSSL的documentation上發現了這個。
該功能目前不存在。 我們最終不得不擴展pyOpenSSL來處理這個問題。
您是否計劃將此功能的實現貢獻給pyOpenSSL項目?如果是這樣,也許OP想要檢查/測試你的代碼。作爲參考,這裏是[get_rev_date]的實現(https://bazaar.launchpad.net/~exarkun/pyopenssl/trunk/view/head:/OpenSSL /crypto/revoked.c#L215) – neirbowj
(我結束了通過python(「openssl crl -in FILENAME.crl -noout -nextupdate」)使用openssl命令,並解析輸出以獲取nextUpdate datetime值。優雅的解決方案......) –
你不能用pyOpenSSL做到這一點,但是這些來自CRLs的信息實際上可以使用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日期。
顯然,在OS X上安裝PyCrypto需要太多的手腳,所以我無法測試代碼,但我認爲它可以工作。但令人遺憾的是,它似乎仍然是最容易堅持在服務器上調用「openssl crl ...」命令並使用該命令的輸出。 OpenSSL將始終存在於我們的環境中,因此不值得將其替換爲非標準庫(在我們的例子中)。 –
或者:當我執行Ubuntu 12.04服務器的標準安裝時,是否包含PyCrypto? –
@JoelL,PyCrypto可以從MacPorts輕鬆安裝到OS X上(例如,如果您使用的是帶有python27的MacPorts,只需運行'sudo port install py27-crypto'),並且也可以在Ubuntu上使用('apt-get install python-crypto ') – abbot
這將返回列表中單個證書的吊銷日期,而不是CRL nextUpdate/lastUpdate字段。 –