检查连接是否为TLSv1与SSLv3(SSL_CIPHER_description / SSL_CIPHER_get_name)

时间:2014-10-30 15:11:01

标签: encryption openssl

我有一个使用OpenSSL的服务器应用程序。我试图了解什么类型的SSL连接到达我的系统(即SSLv2,SSLv3,TLSv1,TLSv1.1,TLSv1.2)。特别是,我正致力于禁用SSLv3(re:POODLE)。在我能做到这一点之前,我想知道SSLv3上的连接是谁/什么

我目前正在使用SSL_CIPHER_description和SSL_CIPHER_get_name函数,这些函数提供了有关为每个连接协商的密码的非常好的信息

我在尝试区分SSLv3与TLSv1连接时遇到了一些挑战。每 https://www.openssl.org/docs/ssl/SSL_CIPHER_get_name.html

"The TLSv1.0 ciphers are flagged with SSLv3. No new ciphers were added by TLSv1.1." 

我已确认TLSv1连接被标记为SSLv3 例如:SSL_CIPHER_description在一个绝对是TLSv1.0的连接上返回以下内容: AES256-SHA SSLv3 Kx = RSA Au = RSA Enc = AES(256)Mac = SHA1

有没有人对如何在OpenSSL中检测SSLv3与TLSv1的连接有什么想法?

2 个答案:

答案 0 :(得分:2)

请参阅API SSL_get_cipher_version()和朋友。

此外,SSLv3 / TLS数据包都以标题开头,您也可以轻松检查:

Byte 0  : Record Type
Byte 1  : Version Major
Byte 2  : Version Minor
Byte 3-4: Length of payload minus header (16k max)

版本主要分解如下:

Major == 2: SSLv2 (The rest differs from SSLv3+ headers)
Major == 3: SSLv3, TLSv1.0, TLSv1.1, or TLSv1.2

版本轻微:

Minor == 0: SSLv3
Minor == 1: TLSv1.0
Minor == 2: TLSv1.1
Minor == 3: TLSv1.2

请注意,在握手/协商完成之前,所使用的版本可能会发生变化。如果您等到应用程序数据,它应该是准确的。 TLSv1.2记录的示例应用程序数据:

0x17 0x03 0x03 ...

嗅探数据!

如果仅仅用于研究,另一种方法是用Wireshark或类似的方式嗅探数据。

答案 1 :(得分:2)

成功协商连接后,您可以使用方法SSL_get_version(SSL *ssl)