在得知使用 -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 似乎都需要修复他们的选项系统,因为它似乎已经筋疲力尽了。请让我知道我是否也在那里。