SafetyNet证明因内部错误而失败

时间:2017-06-16 22:02:26

标签: android google-play-services safetynet

我想使用SafetyNet Attestation API介意这个文档似乎已经过时,因为它使用的方法已被弃用)。使用最新版本的Play服务(11.0.1),我想出了以下代码:

SecureRandom secureRandom = new SecureRandom();
byte[] nonce = new byte[16];
secureRandom.nextBytes(nonce); // just some random bytes for testing

SafetyNet.getClient(this)
    .attest(nonce, API_KEY)
    .addOnCompleteListener(this, task -> {
        if (task.isSuccessful()) {
            SafetyNetApi.AttestationResponse result = task.getResult();
            String jws = result.getJwsResult();
            Log.d(TAG, "JWS: " + jws);
        } else {
            Exception e = task.getException();

            if (e instanceof ApiException) {
                Log.e(TAG, "Attestation failure: " + ((ApiException) e).getStatusMessage() + ", code: " + ((ApiException) e).getStatusCode(), e);
            } else {
                Log.e(TAG, "Attestation failure: " + e, e);
            }
        }
    });

其中API_KEY是Google Developer Console中的API密钥。此代码在Activity的{​​{1}}中调用。无论我尝试了什么,它都会导致失败,onCreate(...)e的实例,但它没有提供有关错误的有用信息,因为状态消息为ApiException且状态为代码是8,根据the documentation - 是一个“内部错误”。我试着用5秒的延迟来调用它,但没有成功。测试设备具有API 24和Google Play服务11.0.55。

任何人都知道出了什么问题以及解决方案是什么?

修改:旧null方式似乎工作正常,但已弃用,所以我不想使用它。

3 个答案:

答案 0 :(得分:0)

根据此thread,如果您收到错误代码8(INTERNAL_ERROR),请在开发者控制台中仔细检查您的应用注册。请注意,每个注册的Android客户端都由(包名称,Android签名证书SHA-1)对唯一标识。如果您的调试和生产环境有多个软件包名称/签名证书,请确保注册每对软件包名称/签名证书。

  

验证:

     
      
  1. 打开Credentials page并选择您的项目
  2.   
  3. 确保每对都有 Android 类型的OAuth 2.0客户端ID。要为Android客户端创建新的OAuth 2.0客户端ID,请从下拉列表中选择新凭据 - > OAuth2客户端ID ,然后选择Android并在其中输入您的包名称/签名证书指纹。
  4.   

如果不起作用,我建议您与Google Play团队联系以获取帮助。您可以通过以下链接与他们联系:https://support.google.com/googleplay#topic=3364260&contact=1

答案 1 :(得分:0)

确保在以下代码中使用正确的WEB API KEY:

SafetyNet.getClient(this)
    .attest(nonce, WEB_API_KEY)......

请参阅以下图片以查找WEB API KEY: FCM Console

答案 2 :(得分:0)

我使用safetynet建议您将程序与以下各项匹配: github SaftyNetHelper

需求/依赖项

  • Google Play服务7+(特别是SafetyNet API) 'com.google.android.gms:play-services-safetynet:10.0.1')
  • 需要Internet权限
  • Android Device Verification API
  • 的Google API密钥