Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用相互身份验证时TLS握手出错_Android_Security_Ssl_Https_Certificate - Fatal编程技术网

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

Android 使用相互身份验证时TLS握手出错,android,security,ssl,https,certificate,Android,Security,Ssl,Https,Certificate,在测试我的应用程序()时,我发现在某些设备上,如果https请求需要客户端证书(即相互身份验证),则应用程序和服务器之间的TLS握手会失败。同样的代码可以在Windows和OS X上运行,因此我知道这不是由错误的证书引起的,也不是因为我忘记将证书包含在SSLContext中。我在一些安卓4.4设备和一些5.0设备上都检测到了它。不幸的是,我没有找到任何导致它失败的共同点(除了Android)。然而,在设备上,如果它出现故障,它会100%地出现故障 我已经分析了网络流量,以便更准确地了解错误发生的

在测试我的应用程序()时,我发现在某些设备上,如果https请求需要客户端证书(即相互身份验证),则应用程序和服务器之间的TLS握手会失败。同样的代码可以在Windows和OS X上运行,因此我知道这不是由错误的证书引起的,也不是因为我忘记将证书包含在SSLContext中。我在一些安卓4.4设备和一些5.0设备上都检测到了它。不幸的是,我没有找到任何导致它失败的共同点(除了Android)。然而,在设备上,如果它出现故障,它会100%地出现故障

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

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

    下面是一个示例,说明了如果握手成功,这两个TLS记录在设备上的外观:

    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,这意味着“完成”

    知道发生了什么事吗?这是什么原因造成的