2016-08-29 46 views
0

我找不到合適的方法來獲取用於由SSLSocket接收的證書的簽名算法的名稱。我知道你可以用SSLSocket.getpeercert(True)來拉對方證書的字節,但我不知道該怎麼做。 PyOpenSSL似乎沒有簡單的接口來從它的字節內容中加載X509。從SSLSocket獲取簽名算法名稱的位置?

我想知道這些信息,因爲帶有SHA1的證書在2017年1月1日之後不允許有到期時間,並且不會通過Python的SSLSocket.do_handshake()實現進行檢查。

+1

您可以改爲使用密碼庫。這一個提供[signature_hash_algorithm](https://cryptography.io/en/latest/x509/reference/#cryptography.x509.Certificate.signature_hash_algorithm)。 –

回答

0

經過非常有用的評論指出我正確的方向後,您可以使用cryptography模塊來加載SSLSocket.getpeercert()函數輸出的DER X509格式。從此Certificate實例中,您還可以訪問許多其他有關證書的字段,例如到期時間。這裏是我現在正在做的方式:

import cryptography.x509 
import cryptography.hazmat.backends.openssl 
import ssl 
sock = ssl.SSLSocket() 

# Wrap a socket, connect, handshake, etc etc... 

cert = cryptography.x509.load_der_x509_certificate(
    sock.getpeercert(True), 
    cryptography.hazmat.backends.openssl.backend 
) 
print(cert.signature_hash_algorithm.name) # This prints "sha1".