В моем приложении есть база данных, которая должна быть защищена ключом, чтобы другие приложения на этом устройстве не могли получать к нему доступ.
Проблема в том, что я не могу получить ключ подписи во время выполнения: что бы я ни делал, CodeSigningKey.get(...)
всегда возвращает null
.
Это мой код:
final CodeSigningKey key = CodeSigningKey.get(AbstractDB.class);
if (key != null) {
Log.d("+ GOT SIGNING KEY");
final DatabaseSecurityOptions secopt = new DatabaseSecurityOptions(key);
db = DatabaseFactory.create(name, secopt);
} else {
Log.d("- SIGNING KEY IS NULL");
}
Я скачал Signing Authority Tool и создал TEST.key
, используя его, и поместил его в {project_root}/keys/TEST.key
в моем проекте Eclipse.
Кроме того, я дважды щелкнул TEST.key
в Eclipse и выбрал AbstractDB
класс для подписи.
Я запускаю свое приложение на реальном устройстве, а не на симуляторе.
Я запускаю его следующим образом:
начать отладку на устройстве - это инициирует упаковку и получение файла .cod. (Однако в окне инструмента подписи я получаю предупреждение о моем ключе TEST.key: «Не зарегистрирован» и «Пожалуйста, свяжитесь с подписывающим лицом и зарегистрируйтесь в Органе подписи.»)
с помощью Инструмента подписи. Я подписываю свой файл .cod, полученный на шаге 1, с помощью моего TEST.key
Я снова нажимаю «Отладка на устройстве», и инструмент подписи снова подписывает основной файл .cod, а затем приложение запускается на устройстве.
Однако ключ, который я получаю от CodeSigningKey.get(..)
, всегда null
.
Что я делаю не так?
Решение
После подсказки от Майкла я смог решить эту проблему.
Прежде всего, действительно, мне нужен был экземпляр объекта в CodeSigningKey.get(...)
. Однако есть одна вещь, о которой вы должны знать: если ваш объект расширяет некоторые классы и / или реализует некоторые интерфейсы, то ВСЕ из них должны быть подписаны одним и тем же ключом для работы. Если какой-либо из классов / интерфейсов предков не подписан, вы получите null
.
Это может быть проблемой, если ваша иерархия достаточно глубока. Информация о том, какие классы подписаны, какие ключи хранятся в BlackBerry_App_Descriptor.xml
, и копируется в параметры инструмента подписи, когда вы нажимаете Отладка. Может случиться, что командная строка становится слишком длинной, поэтому средство подписи завершается неудачно с сообщением «Invalid parameter» в консоли.
Итак, я специально извлек класс для подписи:
final public class SignatureClass {
private static final SignatureClass INSTANCE = new SignatureClass();
private SignatureClass() { }
public static CodeSigningKey getKey() {
return CodeSigningKey.get(INSTANCE);
}
}
Я подписываю только этот класс своим ключом и использую SignatureClass.getKey()
, чтобы получить ключ.
PS: Кроме того, если вы перемещаете / переименовываете классы или ключи, убедитесь, что ссылки для подписи в BlackBerry_App_Descriptor.xml
действительны. Они не обновляются автоматически.
Обновление
Как правильно оформить собственный подписывающий ключ.
В процессе, который я описал выше, мне пришлось подписать файл .cod отдельным инструментом, потому что встроенный инструмент подписи выдал ошибку «Не зарегистрирован» для моего TEST.key
. Чтобы это исправить и автоматически подписать ваш .cod, выполните следующие действия.
После того, как вы создали ключ с помощью Signing Authority Tool, запустите утилиту WebAdmin, включенную в это приложение. Он предлагает вам создать базу данных ключей и запустить сервис WebSigner.
После успешного запуска WebAdmin откройте меню Record->Add
. Вы получите окно, где вы можете создать файл .csi. Настроить: количество запросов - бесконечно; срок годности - никогда; уведомления по электронной почте - нет; файл CSI электронной почты - нет. Нажмите OK, и вы увидите диалоговое окно с сгенерированным PIN-кодом - сохраните его для будущего использования. Файл .csi создается и сохраняется в папке / data в средстве подписи.
Установите файл .csi с помощью Eclipse->Window->Preferences->BlackBerry plugin->Signature Tool->Install new keys
и зарегистрируйте его с помощью PIN-кода с шага 2.
Готово. Отныне, когда вы подписываете ключами RIM, ваш .cod автоматически подписывается и вашим ключом.