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