【问题标题】:Checksum Error while provisioning Android Lollipop配置 Android Lollipop 时出现校验和错误
【发布时间】:2014-10-22 14:22:32
【问题描述】:

使用下面的代码时,我收到消息Couldn't use the admin app due to a checksum error. Contact your IT department。基本上你有两个 Android Lollipop 设备。一台设备未配置(恢复出厂设置),另一台设备上有此编程应用程序。编程应用程序向未配置的设备发送 NFC 命令,告诉它使用您传递给它的数据开始配置。根据 DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC,需要三个字段(APK 位置、APK 文件校验和和包名称)。

APK 正在下载。我正在检查我的服务器日志,它显然来自设备(AndroidDownloadManager 在用户代理中)。

根据 DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM,它是文件的 SHA-1 校验和。校验和不匹配。我尝试了许多不同格式的校验和(十六进制、带空格的十六进制、大写/小写、base64、文本),我想我可能错过了一个测试。

不幸的是,Android Lollipop 源代码尚不可用,否则我会在那里查看。

我该如何解决这个问题?有什么想法吗?

public class ProvisionerActivity extends Activity implements CreateNdefMessageCallback {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        NfcAdapter mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
        mNfcAdapter.setNdefPushMessageCallback(this, this);
    }

    @Override
    public NdefMessage createNdefMessage(NfcEvent event) {
        try {
            Properties p = new Properties();
            p.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, "com.example.deviceownertest");
            p.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION, "http://example.com/DeviceOwnerTest.apk");
            p.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM, "19138948d8a607617971af724ffd08dd7eab771b");

            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            OutputStream out = new ObjectOutputStream(bos);
            p.store(out, "");
            byte[] bytes = bos.toByteArray();

            NdefMessage msg = new NdefMessage(NdefRecord.createMime(DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC, bytes));
            return msg;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

注意:这是使用最新的Android L Developer Preview。我猜这个功能还没有完成是完全可能的。 更新:实际发布也是如此。


APK: https://storage.googleapis.com/randy/DeviceOwnerCheck.apk
校验和: FRaAsqdPSjp9nC5hKIU/ElPv+e4
结果: 使用此 URL这个校验和给出了一个错误,甚至没有进入加密设备屏幕。


我还向GitHub 发布了两个申请。一个发送 NFC 数据进行配置。另一个只是一个应用程序,用于检查该应用程序是设备管理员还是设备所有者。希望有人觉得这很有用。如果您想自己构建 DeviceOwnerCheck,则需要修改 URL 和校验和。

【问题讨论】:

  • 你是否让它与这两个 Github 应用程序一起工作?我遇到了相同的错误消息,并且尝试了不同的下载 url,以及发布和调试版本。我的校验和看起来不错,没有尾随空格,没有特殊字符。你能告诉我你做了什么改变让它工作吗?
  • @InnekeDeClippel 我现在可以让任何 APK 正常工作。请参阅@Rob 的回答。他的解决方案将校验和转换为 URL 安全字符串。它将+ 替换为-,将/ 替换为_,并完全删除填充(=)。另请注意@DeeV 的评论,如果 URL 错误或下载只是失败,您将收到相同的错误消息,因此请检查您的 apache 或 IIS 日志。祝你好运!
  • 非常感谢。经过大量的试验和错误,我使它工作。好像我使用了错误的校验和。
  • @Inneke 你能告诉我创建校验和的确切命令吗,因为我使用的命令与 Rob 建议的相同,但尚未成功。
  • @suniljain 我使用的命令(注意,这是在 Windows 上)是:输入“C:\Users\Inneke\Documents\Projects\KioskTest\app\app-debug.apk”| "C:\Program Files (x86)\GnuWin32\bin\openssl" dgst -binary -sha1 | "C:\Program Files (x86)\GnuWin32\bin\openssl" base64.这会输出如下内容:ABC9AbcABcabcaB0ABC+ABca1bc=。我删除了“=”并将“+”替换为“-”,将“/”替换为“_”。所以我在应用程序中使用的是: p.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM, "ABC9AbcABcabcaB0ABC-ABca1bc");请注意,您必须将路径写入 .apk 文件,而不是密钥库。

标签: android nfc android-5.0-lollipop


【解决方案1】:

哈希码必须是 url 安全的。这将转换并删除尾随填充

$ cat Something.apk | openssl dgst -binary -sha1 | openssl base64 | tr '+/' '-_' | tr -d '='

【讨论】:

  • 还应注意,如果 URL 错误或下载只是失败,也会出现同样的错误。
  • 嗨,Rob,我在使用 NFC 安装设备所有者应用程序时遇到了同样的问题校验和错误,我尝试了上面的命令来创建校验和,但它仍然出现同样的问题,请让我在下面做错的地方是我的命令:cat /home/user/Downloads/adt-bundle-linux-x86_64-20140702/sdk/platform-tools/DevicePolicyDemo_2.1.apk | openssl dgst -binary -sha1 | openssl base64 | tr '+/' '-_' | tr -d '='
  • 我遇到了同样的问题,我使用了这个命令 "C:\Program Files\Java\jdk-11.0.1\bin>keytool -printcert -jarfile "C:\\Projects\\MyEG \MyLogistics\app\build\outputs\apk\dev\debug\TestDPC_5001.apk" | "C:\Program Files\Git\usr\bin\openssl.exe" dgst -binary -sha1 | "C:\Program Files\ Git\usr\bin\openssl.exe" base64 | tr '+/' '-_' | tr -d '='" 它给我错误“tr”不是外部或内部命令。所以我可以在哪里找到 tr 命令
  • 当我使用这个命令时 C:\Program Files\Java\jdk-11.0.1\bin>keytool -printcert -jarfile "C:\\Projects\\MyEG\MyLogistics\app\build \outputs\apk\dev\debug\TestDPC_5001.apk" | "C:\Program Files\Git\usr\bin\openssl.exe" dgst -binary -sha1 | "C:\Program Files\Git\usr\bin\openssl.exe" base64 Rk7aTikXRwU2KrAsqvCABbaLX+g= 没有 tr 命令,因此它给出的值与给出的示例不同。所以这里缺少什么
【解决方案2】:

它似乎不喜欢校验和中的特殊字符。我能够让它与我的 apk 文件一起使用,但校验和没有任何特殊字符。当我尝试使用您的 apk 文件时,我遇到了同样的错误。尝试重新创建 apk,直到它没有特殊字符,然后它应该可以工作。

我猜是缺少某种特殊字符的转义。

【讨论】:

  • 我遇到了和你原来一样的问题,直到我实现了 Yuichi 的解决方案。
  • 是特殊字符!我只是重新编译了几次,直到它创建了一个校验和不包含任何特殊字符的 APK。多么奇怪。但是,我很好奇使任何 APK 工作的正确方法是什么。
  • 是的,这很奇怪,我猜有一些方法可以正确地转义特殊字符。
【解决方案3】:

这是获取哈希码的命令。

$ cat Something.apk | openssl dgst -binary -sha1 | openssl base64

此外,删除所有尾随填充 (=)。

【讨论】:

  • 不幸的是,这给了我和以前一样的结果。校验和不匹配。
  • 我用我正在使用的 APK 的链接更新了我的问题。还添加了我正在使用的两个应用程序的 github 链接(一个用于推送 NFC 数据,另一个是实际应用程序)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
  • 2021-11-07
  • 1970-01-01
  • 2011-11-09
相关资源
最近更新 更多