1

使用适用于 Android 的 Google SafetyNet 时,文档建议您

验证 SSL 证书链并使用 SSL 主机名匹配来确保叶证书是问题attest.android.com

现在这是如何工作的?我会假设我收到 JWS 消息检查证书和签名等,但会针对从 attest.android.com 获取的证书进行验证,但 attest.android.com 不是实时主机。

SSL 签名是否可以在事先不知道域的公钥的情况下进行验证?即我可以验证来自传入 JWS 消息的所有内容吗?我不明白这怎么可能,是吗?

4

1 回答 1

0

不幸的是,文档的描述性不如您必须做的那样。

JWS 数据包括三个部分:标头、有效负载和签名。简化事情,标头包含用于签署有效负载的公钥证书,并且签名包含在最后。

要验证 SafetyNet JWS,您首先需要提取嵌入在标头中的证书。这些证书具有可以验证到公共根证书的信任链,因此您应该验证这些确实是有效的证书,并且它们是颁发给attest.android.com.

然后您取出签名,并根据嵌入的证书对其进行验证。

如果您选中此项,那么您可以信任有效负载。但在查看basicIntegrityand之前ctsProfileMatch,请确保apkPackageName, apkDigestSha256andapkCertificateDigestSha256与您的应用程序匹配,这样您就知道响应实际上来自您未修改的应用程序。

最理想的情况是,您的编程语言应该包括一个 JWS 库和一个 SSL 库,它们可以为您执行此操作,因此您不必自己编写它。公共示例包含一个Java 示例供您细读。

于 2017-07-11T07:20:56.423 回答