SSL_CTX_set_options()是OpenSSL folk使用编译时OpenSSL_NO_心跳来禁用TLSv1心跳的原因吗?

SSL_CTX_set_options()是OpenSSL folk使用编译时OpenSSL_NO_心跳来禁用TLSv1心跳的原因吗?,ssl,openssl,heartbleed-bug,Ssl,Openssl,Heartbleed Bug,在了解到使用-DOPENSSL_NO_HEARTBEATS重新编译将禁用OpenSSL 1.0.1e中的TLSv1 HEARTBEATS后不久,我想知道为什么它不是一个运行时选项,可能被称为类似SSL_OP_NO_TLS_HEARTBEATS的东西 因此,我查看了SSL.H,发现“options”是一个无符号长位掩码,根据编译平台/模式的不同,它可能是32位或64位,但OpenSSL代码似乎假定为32位,而且更重要的是,它意味着它只有32个可能的选项,这似乎已经用尽了,除了位0x00000400

在了解到使用-DOPENSSL_NO_HEARTBEATS重新编译将禁用OpenSSL 1.0.1e中的TLSv1 HEARTBEATS后不久,我想知道为什么它不是一个运行时选项,可能被称为类似SSL_OP_NO_TLS_HEARTBEATS的东西

因此,我查看了SSL.H,发现“options”是一个无符号长位掩码,根据编译平台/模式的不同,它可能是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

你认为这就是他们决定做的原因吗-用心跳代替SSL心跳?如果是这样的话,为什么他们不使用0x0000040L作为SSL\u OP\u NO\u TLS\u心跳?我想知道你对此的看法。实际上,无论这项调查的结果如何,似乎OpenSSL需要修复他们的选项系统,因为它似乎已经耗尽了。如果我也在那里,请告诉我

你明白了:因为[期权制度]似乎已经用尽了

最后分配的选项是针对苹果的
SecureTransport
ECDSA错误(
SSL\u OP\u SAFARI\u ECDHE\u ECDSA\u错误
)。这是以前使用的值。您可以在以下位置阅读有关讨论(以及价值重用)的内容:


如果是这样的话,为什么他们不使用0x0000040L作为SSL\u OP\u NO\u TLS\u心跳

我相信SSL\u OP\u SAFARI\u ECDHE\u ECDSA\u BUG使用它。发件人:


我想知道你对此的看法


我不相信这是一种观点;)

如果SSL_CTX_set_选项用于处理断开的对等点,则大多数选项都是可用的,因此禁用heartbeat实际上还不符合该概念,例如,可能没有已知的SSL堆栈,该堆栈在hello消息的扩展部分中提供接受heartbeat的功能


因此,正确的方法可能是SSL\u ctrl或SSL\u CTX\u ctrl,实际上有一个SSL\u ctrl\u SET\u TLS\u EXT\u HEARTBEAT\u NO\u REQUESTS设置。这会通知hello消息中的对等方它将不接受心跳请求。但是,如果对等方只是忽略此设置并发送心跳信号,它将尽职尽责地响应心跳信号请求:(

“如果使用SSL\u CTX\u set\u选项来处理断开的对等方,则大多数选项都是…”-也许是在服务器端。但我经常在我的客户端上使用
SSL\u OP\u NO\u SSLv2
SSL\u OP\u NO\u SSLv3
SSL\u OP\u NO\u压缩
,它们显然不是bug解决方案。(我不会在服务器上使用
SSL\u OP\u ALL
,因为只有两个左右的应用。我总是在服务器上使用
SSL\u OP\u CIPHER\u server\u首选项
)。好的,这些不是针对断开的对等点的解决方法,而是针对断开的实现:)例如,SSLv3不好,SSLv2更坏,压缩有坏的副作用,需要服务器密码\u服务器\u首选项,因为客户端不知道正确的密码是什么。@Steffen,SSL\u CTX\u set\u options()是一个隐藏对SSL\u CTX\u ctrl()的调用的宏,但我认为你的评论很有用,因为它突出了一些重要的东西:有太多的选项被用来单独绕过bug,而正如jww所说,禁用SSLv2和SSLv3将绕过它们,除了一对,使所有这些选项或多或少都没用。值得思考的是:-)
+#define SSL_OP_SAFARI_ECDHE_ECDSA_BUG 0x00000400L