我有一个使用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的连接有什么想法?
答案 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)
。