3

在得知使用 -DOPENSSL_NO_HEARTBEATS 重新编译将禁用 OpenSSL 1.0.1e 中的 TLSv1 Heartbeats 后不久,我想知道为什么它不是运行时选项,而是可能称为​​ SSL_OP_NO_TLS_HEARTBEATS。

因此,我查看了 SSL.H 并发现“选项”是一个无符号长位掩码,取决于编译平台/模式,它可能是 32 位或 64 位,但似乎 OpenSSL 代码假定为 32 位,而且 - 更重要的是- 这意味着它只有 32 个可能的选项,似乎已经用尽了,除了位 0x00000400L,我从 SSL.H 复制了它们:

/* Option bits for SSL_CTX_set_options() */

#define SSL_OP_MICROSOFT_SESS_ID_BUG                    0x00000001L
#define SSL_OP_NETSCAPE_CHALLENGE_BUG                   0x00000002L
#define SSL_OP_LEGACY_SERVER_CONNECT                    0x00000004L
#define SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG         0x00000008L

#define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG              0x00000010L
#define SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER               0x00000020L
#define SSL_OP_MSIE_SSLV2_RSA_PADDING                   0x00000040L
#define SSL_OP_SSLEAY_080_CLIENT_DH_BUG                 0x00000080L

#define SSL_OP_TLS_D5_BUG                               0x00000100L
#define SSL_OP_TLS_BLOCK_PADDING_BUG                    0x00000200L

   /***** 0x00000400L SEEMS TO BE THE ONLY OPTION BIT FREE *****/

#define SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS              0x00000800L

#define SSL_OP_NO_QUERY_MTU                             0x00001000L
#define SSL_OP_COOKIE_EXCHANGE                          0x00002000L
#define SSL_OP_NO_TICKET                                0x00004000L
#define SSL_OP_CISCO_ANYCONNECT                         0x00008000L

#define SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION   0x00010000L
#define SSL_OP_NO_COMPRESSION                           0x00020000L
#define SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION        0x00040000L
#define SSL_OP_SINGLE_ECDH_USE                          0x00080000L

#define SSL_OP_SINGLE_DH_USE                            0x00100000L
#define SSL_OP_EPHEMERAL_RSA                            0x00200000L
#define SSL_OP_CIPHER_SERVER_PREFERENCE                 0x00400000L
#define SSL_OP_TLS_ROLLBACK_BUG                         0x00800000L

#define SSL_OP_NO_SSLv2                                 0x01000000L
#define SSL_OP_NO_SSLv3                                 0x02000000L
#define SSL_OP_NO_TLSv1                                 0x04000000L
#define SSL_OP_NO_TLSv1_2                               0x08000000L

#define SSL_OP_NO_TLSv1_1                               0x10000000L
#define SSL_OP_NETSCAPE_CA_DN_BUG                       0x20000000L
#define SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG          0x40000000L

#define SSL_OP_CRYPTOPRO_TLSEXT_BUG                     0x80000000L

您认为这就是他们决定使用 -DOPENSSL_NO_HEARTBEATS 而不是 SSL_OP_NO_TLS_HEARTBEATS 的原因吗?如果是这样,他们为什么不将 0x00000400L 用于 SSL_OP_NO_TLS_HEARTBEATS ?我想知道你对此的看法。实际上,无论这次调查的结果如何,OpenSSL 似乎都需要修复他们的选项系统,因为它似乎已经筋疲力尽了。请让我知道我是否也在那里。

4

2 回答 2

2

你明白了:因为 [选项系统] 似乎已经用尽了。

最后分配的选项是针对 Apple 的SecureTransportECDSA 错误 ( SSL_OP_SAFARI_ECDHE_ECDSA_BUG)。这是以前使用的值。您可以在以下位置阅读有关讨论(和价值重用)的信息:


如果是这样,他们为什么不将 0x00000400L 用于 SSL_OP_NO_TLS_HEARTBEATS

我相信SSL_OP_SAFARI_ECDHE_ECDSA_BUG使用它。来自[PATCH] Safari 损坏的 ECDHE-ECDSA 解决方法

+#define SSL_OP_SAFARI_ECDHE_ECDSA_BUG 0x00000400L 

我想知道你对此的看法。

我不相信它的意见;)

于 2014-04-13T12:16:09.923 回答
2

如果 SSL_CTX_set_options 用于解决损坏的对等点,则大多数选项,因此禁用心跳并不真正适合这个概念,例如,可能没有已知的 SSL 堆栈因在扩展部分内提供心跳接受而喋喋不休你好消息。

所以正确的方法可能是 SSL_ctrl 或 SSL_CTX_ctrl,实际上有一个 SSL_CTRL_SET_TLS_EXT_HEARTBEAT_NO_REQUESTS 设置。这会在 hello 消息中通知对等方,它不会接受心跳请求。但是,看起来如果对等方只是忽略此设置并发送心跳,它将尽职尽责地回复心跳请求:(

于 2014-04-13T13:33:04.487 回答