在 OpenSSL 中握手后查找 SSL 版本

Find SSL Version after Handshake in OpenSSL

我想找出目标支持的协议,但问题是它们有很多网站不支持特定版本,但当我执行握手时它成功了,因为目标超过了我提供的版本并在支持的版本上执行握手 [它只发生在 1 个网站]

示例:我传递了一个版本:TLSVersion。TLS_1_2 但握手是使用 TLSv1_0 执行的,因为它不支持 TLSVersion。TLS_1_2

由于上述问题,我想检查握手的版本,我不想使用 scapy.ssl_tls

version = [SSL.SSLv23_METHOD,
            SSL.TLSv1_METHOD,
            SSL.TLSv1_1_METHOD,
            SSL.TLSv1_2_METHOD]
context = OpenSSL.SSL.Context(version)
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
soc.settimeout(CONNECTION_TIMEOUT)
connection = OpenSSL.SSL.Connection(context,soc)
connection.connect((host,port))
connection.do_handshake() 
#wants to check version here

Find SSL Version after Handshake in OpenSSL...

如果我正确地解析了你想要的...你想要像 openssl s_client:

打印的协议版本
$ openssl version
OpenSSL 1.1.0b  26 Sep 2016

$ openssl s_client -connect www.google.com:443 -servername www.google.com
CONNECTED(00000005)
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify error:num=20:unable to get local issuer certificate
Server did acknowledge servername extension.
---
...
---
New, TLSv1.2, Cipher is ECDHE-RSA-CHACHA20-POLY1305
Server public key is 2048 bit
Secure Renegotiation IS supported
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
...

“New, TLSv1.2” 的第一条消息告诉您有关密码的信息。也就是说,ECDHE-RSA-CHACHA20-POLY1305 何时首次到达 TLS。在 ECDHE-RSA-CHACHA20-POLY1305 的情况下,密码套件首次出现在 TLS 1.2 中。

s_client 的源代码位于 <openssl src>/apps/s_client.c。 OpenSSL 1.0.2 中负责的代码在第 2210 行附近:

/* line 2210 */
c = SSL_get_current_cipher(s);
BIO_printf(bio, "%s, Cipher is %s\n",
           SSL_CIPHER_get_version(c), SSL_CIPHER_get_name(c));
...

“协议:TLSv1.2”的第二条消息告诉你在密钥交换和随后的密码选择和批量传输过程中使用的协议版本。

OpenSSL 1.0.2 中负责的代码在第 105 行附近<openssl src>/ssl/ssl_txt.c

/* line 105 */
int SSL_SESSION_print(BIO *bp, const SSL_SESSION *x)
{
    unsigned int i;
    const char *s;

    if (x == NULL)
        goto err;
    if (BIO_puts(bp, "SSL-Session:\n") <= 0)
        goto err;
    if (x->ssl_version == SSL2_VERSION)
        s = "SSLv2";
    else if (x->ssl_version == SSL3_VERSION)
        s = "SSLv3";
    else if (x->ssl_version == TLS1_2_VERSION)
        s = "TLSv1.2";
    else if (x->ssl_version == TLS1_1_VERSION)
        s = "TLSv1.1";
    else if (x->ssl_version == TLS1_VERSION)
        s = "TLSv1";
    else if (x->ssl_version == DTLS1_VERSION)
        s = "DTLSv1";
    else if (x->ssl_version == DTLS1_2_VERSION)
        s = "DTLSv1.2";
    else if (x->ssl_version == DTLS1_BAD_VER)
        s = "DTLSv1-bad";
    else
        s = "unknown";
    if (BIO_printf(bp, "    Protocol  : %s\n", s) <= 0)
        goto err;

    ...
}

I want to find out the protocols supported by a target but the problem is that their are quite a number websites which are not supporting a particular version but when i performed handshake ...

这是一个不同的问题。您应该在 SSLScan - Fast SSL Scanner 查看 sslscan 的源代码,了解它是如何工作的。 Sourceforge 一个似乎被遗弃了。它缺少 SNI 和其他新功能,例如安全协商和 ALPN。

您可以试试 GitHub 中的 sslscanrbsec/sslscan。 GitHub 一个正在积极维护并且似乎是最新的。


example : i passed a version :TLSVersion.TLS_1_2 but the handshake is performed using TLSv1_0 becz it is not supporting TLSVersion.TLS_1_2

这不会发生。 TLS 只指定一个协议版本。这个想法是你尝试 TLS 1.2。如果失败,那么您将退回到 TLS 1.1。如果失败,那么您将退回到 TLS 1.0。 无穷无尽.

尝试后备方法是 RFC 7504, TLS Fallback Signaling Cipher Suite Value (SCSV) for Preventing Protocol Downgrade Attacks. This was an awful band-aide from the Browser crowd. See, for example, Last Call: <draft-ietf-tls-downgrade-scsv-03.txt> (TLS Fallback Signaling Cipher Suite Value (SCSV) for Preventing Protocol Downgrade Attacks) to Proposed Standard 的原因。

TLS 接受许多人认为的一系列协议版本。我们曾多次尝试对其进行更改。参见,例如,A new TLS version negotiation mechanism.

i want to check the version on handshake

在 pyOpenSSL 中检查客户端和服务器用于剩余会话的版本的相关函数是 get_protocol_version_name or get_protocol_version:

connection.do_handshake()
#wants to check version here
print(connection.get_protocol_version_name())

请注意,这些函数仅在 pyOpenSSL 0.16.0 之后可用

另请注意,您在创建上下文时不能指定 TLS 方法列表,但 only a single method 实质上指定了客户端支持的最低 TLS 版本。于是

context = OpenSSL.SSL.Context(SSL.TLSv1_METHOD)

允许客户端使用 TLS 1.0 及更高版本。如果您改为使用 SSL.TLSv1_2_METHOD,客户端将被限制为 TLS 1.2 或更好,因此无法与仅支持 TLS 1.0 的服务器建立 SSL 连接。