在 OpenSSL 中握手后查找 SSL 版本...
如果我正确解析了您想要的内容...您想要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));
...
“Protocol: 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;
...
}
我想找出目标支持的协议,但问题是它们有很多不支持特定版本的网站,但是当我执行握手时...
这是一个不同的问题。您应该在 SSLScan - Fast SSL Scanner 上查看sslscan 的源代码,了解它是如何工作的。 Sourceforge 似乎被遗弃了。它缺少 SNI 和其他新功能,例如安全协商和 ALPN。
你可以试试这个来自 GitHub 的 sslscan:rbsec/sslscan。 GitHub 得到了积极维护,并且似乎更新了。
示例:我传递了一个版本:TLSVersion.TLS_1_2,但握手是使用 TLSv1_0 执行的,因为它不支持 TLSVersion.TLS_1_2
这不会发生。 TLS 仅指定一个协议版本。这个想法是你尝试 TLS 1.2。如果失败,那么您将退回到 TLS 1.1。如果失败,那么您将回退到 TLS 1.0。 广告无限。
try-and-fallback 方法是RFC 7504, TLS Fallback Signaling Cipher Suite Value (SCSV) for Preventing Protocol Downgrade Attacks 的原因。这是浏览器人群的一个糟糕的创可贴。例如,请参阅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。