在clienthello之后SSL握手失败

时间:2014-02-13 22:33:36

标签: networking openssl

编辑:我将此作为调试SSL的一个很好的例子。

最终分析:我们遇到了一个网络问题,其中一个路由器错误配置了一个完全不同的应用程序,导致该路由器在CPU使用率上运行边界线。最初的几次握手没有固定它...然后随后的一次握手,并且当路由器过载时连接被丢弃。这是一个SSL问题,当它真的完全是另一回事。

外卖:当SSL在中间连接完全掉线时,请务必检查控件中路由器的负载水平。


我已经有一段时间了,所以希望我能提供准确的图片。

我们在第三方提供商处拥有SVN和Git存储库。我们注意到每个都会间歇性地挂起,屏幕没有错误。在SVN的情况下,该过程必须在Git中被杀死-ced,ctrl-C就足够了。

调查我发现SSL握手协商失败了。在SVN中,我们会得到握手部分而且......没有。

现在,我知道我们在其他地方使用这些回购而没有已知的问题,所以这是我第一次走下去的rabbithole。

  1. 这只发生在一个数据中心。不在我们的网络中。这些回购在任何地方都很好,否则,但在这个数据中心,大约有3个请求挂起在SSL握手上。

  2. 除了第三方提供商之外,这些相同的计算机可以在其他任何地方访问SSL握手。

  3. 所以,我钻研了SSL握手,最后降落在:

    openssl s_client -msg -debug -state -connect DOMAIN.DOM:443停在这里:

    CONNECTED(00000003)
    SSL_connect:before/connect initialization
    write to 0x20b94e0 [0x20b9560] (317 bytes => 317 (0x13D))
    0000 - 16 03 01 01 38 01 00 01-34 03 03 88 0a 00 73 97   ....8...4.....s.
    0010 - 12 69 c9 00 65 29 10 f6-57 00 57 44 e8 0e 3f cf   .i..e)..W.WD..?.
    0020 - af a0 f9 80 e2 20 98 f0-d2 79 8c 00 00 9e c0 30   ..... ...y.....0
    0030 - c0 2c c0 28 c0 24 c0 14-c0 0a c0 22 c0 21 00 a3   .,.(.$.....".!..
    0040 - 00 9f 00 6b 00 6a 00 39-00 38 00 88 00 87 c0 32   ...k.j.9.8.....2
    0050 - c0 2e c0 2a c0 26 c0 0f-c0 05 00 9d 00 3d 00 35   ...*.&.......=.5
    0060 - 00 84 c0 12 c0 08 c0 1c-c0 1b 00 16 00 13 c0 0d   ................
    0070 - c0 03 00 0a c0 2f c0 2b-c0 27 c0 23 c0 13 c0 09   ...../.+.'.#....
    0080 - c0 1f c0 1e 00 a2 00 9e-00 67 00 40 00 33 00 32   .........g.@.3.2
    0090 - 00 9a 00 99 00 45 00 44-c0 31 c0 2d c0 29 c0 25   .....E.D.1.-.).%
    00a0 - c0 0e c0 04 00 9c 00 3c-00 2f 00 96 00 41 c0 11   .......<./...A..
    00b0 - c0 07 c0 0c c0 02 00 05-00 04 00 15 00 12 00 09   ................
    00c0 - 00 14 00 11 00 08 00 06-00 03 00 ff 01 00 00 6d   ...............m
    00d0 - 00 0b 00 04 03 00 01 02-00 0a 00 34 00 32 00 0e   ...........4.2..
    00e0 - 00 0d 00 19 00 0b 00 0c-00 18 00 09 00 0a 00 16   ................
    00f0 - 00 17 00 08 00 06 00 07-00 14 00 15 00 04 00 05   ................
    0100 - 00 12 00 13 00 01 00 02-00 03 00 0f 00 10 00 11   ................
    0110 - 00 23 00 00 00 0d 00 20-00 1e 06 01 06 02 06 03   .#..... ........
    0120 - 05 01 05 02 05 03 04 01-04 02 04 03 03 01 03 02   ................
    0130 - 03 03 02 01 02 02 02 03-00 0f 00 01 01            .............
    >>> TLS 1.2 Handshake [length 0138], ClientHello
    01 00 01 34 03 03 88 0a 00 73 97 12 69 c9 00 65
    29 10 f6 57 00 57 44 e8 0e 3f cf af a0 f9 80 e2
    20 98 f0 d2 79 8c 00 00 9e c0 30 c0 2c c0 28 c0
    24 c0 14 c0 0a c0 22 c0 21 00 a3 00 9f 00 6b 00
    6a 00 39 00 38 00 88 00 87 c0 32 c0 2e c0 2a c0
    26 c0 0f c0 05 00 9d 00 3d 00 35 00 84 c0 12 c0
    08 c0 1c c0 1b 00 16 00 13 c0 0d c0 03 00 0a c0
    2f c0 2b c0 27 c0 23 c0 13 c0 09 c0 1f c0 1e 00
    a2 00 9e 00 67 00 40 00 33 00 32 00 9a 00 99 00
    45 00 44 c0 31 c0 2d c0 29 c0 25 c0 0e c0 04 00
    9c 00 3c 00 2f 00 96 00 41 c0 11 c0 07 c0 0c c0
    02 00 05 00 04 00 15 00 12 00 09 00 14 00 11 00
    08 00 06 00 03 00 ff 01 00 00 6d 00 0b 00 04 03
    00 01 02 00 0a 00 34 00 32 00 0e 00 0d 00 19 00
    0b 00 0c 00 18 00 09 00 0a 00 16 00 17 00 08 00
    06 00 07 00 14 00 15 00 04 00 05 00 12 00 13 00
    01 00 02 00 03 00 0f 00 10 00 11 00 23 00 00 00
    0d 00 20 00 1e 06 01 06 02 06 03 05 01 05 02 05
    03 04 01 04 02 04 03 03 01 03 02 03 03 02 01 02
    02 02 03 00 0f 00 01 01
    SSL_connect:unknown state
    

    它挂在那里。在成功连接时,调试输出的下一行应为

    read from 0x1735590 [0x173ab70] (7 bytes => 7 (0x7))
    0000 - 16 03 03 00 42 02                                 ....B.
    0007 - <SPACES/NULS>
    read from 0x1735590 [0x173ab7a] (64 bytes => 64 (0x40))
    0000 - 00 3e 03 03 52 fd 41 af-09 0b 96 d6 c4 01 c2 1b   .>..R.A.........
    0010 - eb e9 23 71 93 a6 1b 78-df 67 17 fe 86 c4 f9 82   ..#q...x.g......
    0020 - 53 4f 36 09 00 c0 30 00-00 16 ff 01 00 01 00 00   SO6...0.........
    0030 - 0b 00 04 03 00 01 02 00-23 00 00 00 0f 00 01 01   ........#.......
    <<< TLS 1.2 Handshake [length 0042], ServerHello
    
    02 00 00 3e 03 03 52 fd 41 af 09 0b 96 d6 c4 01
    c2 1b eb e9 23 71 93 a6 1b 78 df 67 17 fe 86 c4
    f9 82 53 4f 36 09 00 c0 30 00 00 16 ff 01 00 01
    00 00 0b 00 04 03 00 01 02 00 23 00 00 00 0f 00
    01 01
    SSL_connect:SSLv3 read server hello A
    

    所以,正如你所看到的那样,在握手接近完成之前就已经这样了。

    据我所知,我们的客户发起握手(cleinthello),有时在线上保持沉默。

    我已经尝试过升级openssl,没有任何变化。而且,这只是从这个数据中心连接到这一个提供商。

    我遇到某种网络问题,以某种方式过滤传出的SSL流量,但我不知道为什么会发生这种情况。

    我们非常感谢您在故障排除过程中对下一步行程的任何想法。谢谢。

    编辑:尝试了多个密码,可以全部重现,再次引发我可能的网络问题。

    编辑:与gnutls相似的结果:

    ifx14:/home/cadre/stresler# gnutls-cli -d 9 DOMAIN.DOM
    Resolving 'DOMAIN.DOM'...
    Connecting to 'X.X.X.X:443'...
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: DHE_RSA_AES_128_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: DHE_RSA_CAMELLIA_128_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: DHE_RSA_AES_256_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: DHE_RSA_CAMELLIA_256_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: DHE_RSA_3DES_EDE_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: DHE_DSS_AES_128_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: DHE_DSS_CAMELLIA_128_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: DHE_DSS_AES_256_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: DHE_DSS_CAMELLIA_256_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: DHE_DSS_3DES_EDE_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: DHE_DSS_ARCFOUR_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: DHE_PSK_SHA_AES_128_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: DHE_PSK_SHA_AES_256_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: DHE_PSK_SHA_3DES_EDE_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: DHE_PSK_SHA_ARCFOUR_SHA1
    |<3>| HSK[0x1a11a60]: Removing ciphersuite: SRP_SHA_RSA_AES_128_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Removing ciphersuite: SRP_SHA_RSA_AES_256_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Removing ciphersuite: SRP_SHA_RSA_3DES_EDE_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Removing ciphersuite: SRP_SHA_DSS_AES_128_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Removing ciphersuite: SRP_SHA_DSS_AES_256_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Removing ciphersuite: SRP_SHA_DSS_3DES_EDE_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: RSA_AES_128_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: RSA_CAMELLIA_128_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: RSA_AES_256_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: RSA_CAMELLIA_256_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: RSA_3DES_EDE_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: RSA_ARCFOUR_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: RSA_ARCFOUR_MD5
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: PSK_SHA_AES_128_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: PSK_SHA_AES_256_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: PSK_SHA_3DES_EDE_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Keeping ciphersuite: PSK_SHA_ARCFOUR_SHA1
    |<3>| HSK[0x1a11a60]: Removing ciphersuite: SRP_SHA_AES_128_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Removing ciphersuite: SRP_SHA_AES_256_CBC_SHA1
    |<3>| HSK[0x1a11a60]: Removing ciphersuite: SRP_SHA_3DES_EDE_CBC_SHA1
    |<2>| EXT[0x1a11a60]: Sending extension CERT_TYPE
    |<2>| EXT[0x1a11a60]: Sending extension SERVER_NAME
    |<3>| HSK[0x1a11a60]: CLIENT HELLO was send [131 bytes]
    |<4>| REC[0x1a11a60]: Sending Packet[0] Handshake(22) with length: 131
    |<2>| ASSERT: gnutls_cipher.c:204
    |<4>| REC[0x1a11a60]: Sent Packet[1] Handshake(22) with length: 136
    

4 个答案:

答案 0 :(得分:4)

这是陈旧的,已经回答了,但我们遇到了同样的问题,原因也不同。

关键是在我们的边缘路由器上嗅探流量,我们在那里看到了向服务器(GitHub.com)发送的ICMP消息,要求碎片。这会弄乱连接,重传,重复的ACK等等。

enter image description here

ICMP数据包有一个字段,MTU of next hop有一个奇怪的值,1450。通常的值是1500。

enter image description here

我们检查了路由器,其中一个接口(以太网隧道)将此值作为MTU,因此路由器将所有接口的最小MTU作为下一跳。一旦我们删除了这个接口(它没有使用),SSL握手就会重新开始工作。

答案 1 :(得分:0)

正如我所看到的,客户端hello在位置00cb上有一个字节:0xFF不应该存在。因此无法正确读取以下字节数据...

00c0 - 00 14 00 11 00 08 00 06-00 03 00 ff 01 00 00 6d ............... m

不确定,但似乎是openssl中的一个错误,因此防火墙或Web代理会忽略该请求。

答案 2 :(得分:0)

好吧,我遇到了类似的问题。在ClientHello之后,SSL握手立即终止并出现错误。事实证明服务器需要比我安装的更强的密码,因此我必须安装Java Cryptography Extension(JCE)(http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html)。

更有趣的是,我们在服务器上遇到了同样的问题,我们在那里有JCE的罐子但是有些旧的版本因此遇到了同样的问题。用最新版本替换它们解决了这个问题。

顺便说一句,你知道如何获得所需的服务器密码吗?或者更好地比较客户端和服务器密码?所以人们会立即看到不匹配。

答案 3 :(得分:0)

对于遇到此问题的人们,我创建了一个清单:

  • 确保在Internet Explorer中启用了所有TLS版本(这是为了进行测试。您可以在找到根本原因后禁用不安全的版本)

  • 检查下面的注册表项,以确保在注册表级别应用在Internet Explorer中设置的内容。如果有工作服务器和不工作服务器,请镜像工作服务器的设置HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols

  • 从客户端收集网络跟踪。检查客户端和服务器是否在密码套件上达成一致。如果不是,请确保客户端使用服务器尝试使用的密码套件。组策略设置低于Computer Configuration > Administrative Templates > Network > SSL> Configuration Settings > SSL Cipher Suite Order

  • 如果存在问题,请在两者之间查找可能阻止TLS通信的任何网络设备(代理,防火墙,负载平衡器等)

  • 检查IIS中的网站绑定。确保证书有效,并且端口设置为443

  • 确保在服务器(netstat -an -p TCP | find /I "listening")中侦听端口443。详细信息:IIS服务器中未侦听端口80和443 将端口号更改为444并测试网站。如果可访问,则表示存在软件阻塞或覆盖443端口。 More details

  • 禁用Windows防火墙(如果可以,请重新启用它并相应地设置规则)

  • 在服务器中查找任何第三方应用程序,例如防病毒或端点保护软件,例如Symantec Endpoint Security和Symantec Data Center Security Server Agent(基于this document,Security Server Agent使用端口443 )。卸载它们(不要只是禁用。完全卸载。如果可以,则可以重新安装它们并进行相应配置)

  • 检查是否存在使用端口443的任何Microsoft软件。诸如SQL Server Reporting Services(SSRS)和Windows Admin Center之类的应用程序可能会干扰端口443。An example

来源:The missing Server Hello in TLS handshake (ERR_SSL_PROTOCOL_ERROR