在受支持的版本上握手失败

HandShake Failure On a supported Version

我正在尝试确定 TLS_1_2 是否是网站上受支持的版本,即 (portal.threatpulse.com,443)

from scapy_ssl_tls.ssl_tls import *

target = (portal.threatpulse.com,443)
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(target)
pkt = TLSRecord(version = 'TLS_1_2')/TLSHandshake()
     /TLSClientHello(version = 'TLS_1_2')
sock.sendall(str(pkt))
resp_pkt = sock.recv(8192)
resp = SSL(resp_pkt)
resp.show()

即使支持此版本,它仍显示握手失败。 此代码 运行 正确

由于当今的证书通常具有 SHA-256 签名,因此服务器要求客户端支持 RSA/SHA-256 和 signature/hash 算法。但是这种组合不包含在 TLS 1.2 中新增的 SignatureAndHashAlgorithm TLS 扩展的默认集中。此默认设置仅包括(带有 RSA、DSA 或 ECDSA 的 SHA-1。如果 TLS 1.2 客户端支持比默认更多或不同的算法,则需要包含 SignatureAndHashAlgorithm 扩展并明确宣布支持此 signature/hash 对。使用以下代码,这个特定站点对我有用,但对于其他站点,您可能需要扩展它以也包括 ECDSA。

pkt = TLSRecord(version = 'TLS_1_2') / \
    TLSHandshake() / \
    TLSClientHello(
        version = 'TLS_1_2',
        extensions=[ TLSExtension() / \
            TLSExtSignatureAndHashAlgorithm( algorithms = [
                TLSSignatureHashAlgorithm(
                    hash_algorithm = TLSHashAlgorithm.SHA256,
                    signature_algorithm = TLSSignatureAlgorithm.RSA
                )
            ])
        ]
    )