使用相互身份验证时TLS握手出错

时间:2015-08-17 06:37:56

标签: android security ssl https certificate

在测试我的应用程序(https://play.google.com/apps/testing/com.degoo.android)时,我发现在某些设备上,如果https请求需要客户端证书(即相互身份验证),则应用程序与我们服务器之间的TLS握手会失败。相同的代码适用于Windows和OS X,因此我知道它不是由不正确的证书引起的,或者我忘记将证书包含在SSLContext中。我已在某些Android 4.4设备和某些5.0设备上检测到它。不幸的是,我还没有发现导致它失败的任何共同点(除Android之外)。然而,在设备上它失败了,它在100%的时间内失败。

我已经分析了网络流量,以便更准确地查看错误发生的时间。以下内容适用于所有设备:

  1. 建立连接,客户端成功验证服务器的证书。
  2. 客户端发送它的HTTP请求。
  3. 服务器检测到请求是针对受保护区域的,并发送certificate_request。
  4. 客户端决定发送哪个客户端证书(我们可以看到它选择了正确的证书)并发送它。
  5. 客户端使用其证书响应后,它再发送两个TLS记录,然后握手失败。

    这里有一个示例,说明这两个TLS记录在设备上的样子是握手SUCCEEDS:

    14 03 01 00 20 9c 07 49 78 9f ba 09 03 41 6b 66 ad 46 e2 75 94 f7 cf 18 bd 11 cf 35 a2 eb 5e b8 a8 4c 2a 1d c5
    
    16 03 01 00 30 20 0e 13 d7 48 b9 6e b2 1b 96 6f 10 56 67 81 63 d9 d8 c7 73 23 95 3b f9 da f9 ce f4 f8 d1 7e 1b a4 12 92 4c 4f 54 a5 f8 49 75 d5 46 f4 2d 29 97
    

    以下是设备上这两条TLS记录的外观示例:握手失败:

    14 03 01 00 20 a9 86 c2 fd 03 0a f8 08 fa f8 9e eb b7 97 07 56 6f 27 c0 d6 8f 95 be 77 c1 44 84 e9 e1 56 6f 6a
    
    16 03 01 00 30 ff 36 76 e5 47 87 84 71 1c ce c9 08 41 45 fc 09 c6 ef 08 e6 21 ff 45 3a 10 ae 8d 5a 99 5f ca c5 ac bd bf 7e ca 69 32 4d 1f 01 c6 30 83 8e 06 cb
    

    从记录的第一个字节开始,我可以看到两个客户端都发送了更改密码规范记录,然后发送了一个握手记录。关于失败设备的一个有趣的事情是第二个记录的索引5的字节具有值ff。当我查看TLS规范时,我没有看到任何具有该值的握手记录类型。成功的设备将该字节设置为20,这意味着"已完成"。

    知道发生了什么事吗?什么可能导致这个?

0 个答案:

没有答案