我使用SafetyNet API检查设备是否已 root 并使用以下有用的代码,但这使用 Android 验证 API 来验证 JWT 签名:
https://github.com/scottyab/safetynethelper
我想在客户端进行验证只是为了减少另一个 Web 服务的开销,而且它每天只有 10k 请求的限制。
所以解码 JWS 后我得到以下信息
JWS 消息响应示例
xxxx.yyy.zzzz
标头数据
{"alg":"RS256","x5c":["<certificate1 string>","<certificate2 string>"]}
Run Code Online (Sandbox Code Playgroud)
有效载荷数据
{"nonce":"<nounce>",
"timestampMs":1472794339527,
"apkPackageName":"<apkPackageName>",
"apkDigestSha256":"<sha digest string>",
"ctsProfileMatch":true,
"extension":"<extension string>",
"apkCertificateDigestSha256":["<apkCertificateDigestSha256 string>"],"basicIntegrity":true}
Run Code Online (Sandbox Code Playgroud)
如果执行 Base64 解码,此部分中的签名将变得不可读,因此下面是 JWS 最后一个元素中收到的签名字符串
Gw09rv1aBbtd4Er7F5ww_3TT1mPRD5YouMkPkwnRXJq8XW_cxlO4428DHTJdD8Tbep-Iv3nrVRWt2t4pH1uSr2kJ9budQJuXqzOUhN93r2Hfk-UAKUYQYhp89_wOWjSCG4ySVHD4jc9S1HrZlngaUosocOmhN4SzLZN5o8BXyBdXkjhWwgArd4bcLhCWJzmxz5iZfkhDiAyeNRq09CeqjRx_plqAy8eR_OaI_2idZBNIGfd2KmLK_CKaeVjDxuC4BzJsIlVRiuLrvP362Wwhz4r1bHh8flmHr88nK99apP2jkQD2l7lPv8y5F3FN3DKhJ15CzHR6ZbiTOw1fUteifg
Run Code Online (Sandbox Code Playgroud)
现在根据谷歌
“验证兼容性检查响应:从 JWS 消息中提取 SSL 证书链。验证 SSL 证书链并使用 SSL 主机名匹配来验证叶证书是否颁发给主机名 attest.android.com。使用证书来验证JWS 消息的签名。”
我确实有证书字符串和签名,我应该如何验证 SSL 证书(该证书是第二个证书上的字符串和主机名匹配)以及如何验证签名。
我需要这方面的指导,剪断代码会非常有帮助。