解码Scapy ASN1编码的SSL / TLS证书字段

时间:2018-01-26 11:04:10

标签: python ssl scapy asn.1

我使用scapy-ssl_tls库从serverhello数据包中提取SSL / TLS证书字段,我使用pip安装。

问题是,我无法找到从ASN1编码字段中提取值的方法:

sign_algo2:  <ASN1_OID['.1.2.840.113549.1.1.11']>
sa2_value:  <ASN1_NULL[0L]>
not_before:  <ASN1_UTC_TIME['170321131500Z']>
not_after:  <ASN1_UTC_TIME['200321131500Z']>
pubkey_algo:  <ASN1_OID['.1.2.840.113549.1.1.1']>
version:  <ASN1_INTEGER[2L]>
sn:  <ASN1_INTEGER[6348220899422160075L]>
sign_algo:  <ASN1_OID['.1.2.840.113549.1.1.11']>
pubkey:  <ASN1_BIT_STRING['\x000\x']>

我已经挖出scapy.layers.ssl_tls,ssl_tls_crypto,scapy.layers.x509模块,但无法获得任何提示进行解码。我也尝试使用asn1crypto.core包中的Asn1Value.load(),但它失败并出现以下错误:

TypeError: encoded_data must be a byte string, not scapy.asn1.asn1.ASN1_UTC_TIME

如果有人能帮助我使用scapy的原生解码优先或任何其他方式解决这个问题,那就太好了。

注意:请注意我已经从我从pcap文件中读取的SSL / TLS serverhello数据包中提取这些值,因为我还需要来自数据包标头的其他字段。我知道stackoverflow或wireshark / tshark上存在很多解决方案,用于从.pem文件中提取/读取证书,或者可能来自.der文件(在明确地从wireshark导出之后),但是我不需要工作,因为我需要一个解决方案,用于从数据包中提取证书或证书字段。

3 个答案:

答案 0 :(得分:1)

确保将asn1cryp传递给字节字符串,而不是一些内部scapy对象。可能需要将后者转换为字节串。

或者,this tool旨在将X.509证书解码为Python对象树。您还需要提供字符串(Python2)或字节(Python 3)。

答案 1 :(得分:1)

如果您有X.509证书的DER编码字节字符串,则使用asn1crypto的正确方法是:

from asn1crypto import x509

cert = x509.Certificate.load(der_byte_string)
print(cert.native)

从错误消息中可以看出,您试图传递一些代表ASN.1值的Python对象。

答案 2 :(得分:0)

这已经在scapy-ssl_tls issue #116中讨论过,它描述了scapy ASN.1字段的基本处理:

...
# resp holds the raw socket response to a client_hello

tls_response = TLS(resp)
tls_response.show()  # show the structure

# iterate all certificates
for cert in tls_response[TLSCertificateList].payload.certificates:
    # .payload as the structure is [...][TLSCertificateList][TLS10Certificate].certificates = [x509Cert,x509Cert,...]
    # we'll have a TLSCertificateList object at this point; get the scapy X509Cert Object
    tlscert = cert[X509Cert]
    print repr(str(tlscert.sign_algo)) # raw bytes -> '\x06\t*\x86H\x86\xf7\r\x01\x01\x0b'
    print repr(tlscert.sign_algo) # <ASN1_OID['.1.2.840.113549.1.1.11']>
    print tlscert.sign_algo.val # 1.2.840.113549.1.1.11
    print repr(tlscert.version) # <ASN1_INTEGER[2L]>
    print tlscert.version.val # 2