在我的应用中,我有一个数据库,必须使用密钥保护该设备上的其他应用才能访问它。
问题是我无法在运行时获取签名密钥:无论我做什么,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");
}
我已经下载了签名授权工具并使用它创建了TEST.key
,并将其放在{project_root}/keys/TEST.key
的Eclipse项目中。
另外,我在Eclipse中点击了TEST.key
,并选择了AbstractDB
类与之签名。
我在真实设备上运行我的应用,而不是在模拟器中运行。
我按如下方式运行:
在设备上开始调试 - 这会启动打包和签名.cod文件。 (但是,在签名工具窗口中,我收到有关我的TEST.key的警告:“未注册”和“请联系签名者并向签名机构注册。”)
使用签名授权工具我使用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,请执行以下步骤。
使用签名授权工具创建密钥后,启动该应用程序中包含的WebAdmin实用程序。它允许您创建密钥数据库并启动WebSigner服务。
成功启动WebAdmin后,点击菜单Record->Add
。您将获得一个窗口,您可以在其中创建.csi文件。配置:请求数 - 无限;到期日 - 永远不会;电子邮件通知 - 无;电子邮件CSI文件 - 没有。单击确定,您将看到一个包含生成的PIN的对话框 - 保存以备将来使用。生成.csi文件并将其保存在签名授权工具的/ data文件夹中。
使用Eclipse->Window->Preferences->BlackBerry plugin->Signature Tool->Install new keys
安装.csi文件,并使用步骤2中的PIN进行注册。
完成。从现在开始,使用RIM密钥签名时,您的.cod也会自动使用您的密钥签名。
答案 0 :(得分:2)
我相信您需要来自应用的对象实例,而不是类对象。在这种情况下,“这个”应该有效。