Ошибка контрольной суммы при инициализации Android Lollipop

Я получаю сообщение Couldn't use the admin app due to a checksum error. Contact your IT department при использовании кода ниже. В основном у вас есть два устройства Android Lollipop. Одно устройство не предусмотрено (сброс настроек), а на другом - приложение для программирования. Приложение для программирования отправляет команду NFC на непредоставленное устройство, чтобы сообщить ему о необходимости инициализации с использованием данных, которые вы передаете ему. В соответствии с DevicePolicyManager требуется три поля (местоположение APK, контрольная сумма файла APK и имя пакета). MIME_TYPE_PROVISIONING_NFC.

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 для предоставления. Другой - просто приложение, чтобы проверить, является ли приложение администратором устройства или владельцем устройства. Надеюсь, кто-то найдет это полезным. Вам нужно будет изменить URL-адрес и контрольную сумму, если вы хотите собрать DeviceOwnerCheck самостоятельно.

3 ответа

Решение

Хеш-код должен быть безопасным. Это преобразует и удаляет завершающие отступы

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

Похоже, что ему не нравятся специальные символы в контрольной сумме. Я смог заставить его работать с моим файлом apk, но контрольная сумма не имела никаких специальных символов. Когда я попытался использовать ваш файл apk, я получил ту же ошибку. Попробуйте воссоздать apk, пока у него не будет специальных символов, и тогда он должен работать.

Я предполагаю, что отсутствует какое-либо экранирование специальных символов.

Вот команда для получения хеш-кода.

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

Также удалите все завершающие отступы (=).

Другие вопросы по тегам