[J2ME] Signing a midlet suite的讨论稿
发起者:郑昀(zhengyun_ustc)
[问题]如何对一个MIDlet jar签名呢?
很多人都想知道怎么让自己的MIDlet访问网络啦、发送短信啦都能够不弹出烦人的警告框。
单纯回答说“你必须去Versign购买一个证书,或者找厂商签名”之类的话,也是让人不知道该如何具体操作的,还是懵懵懂懂的。
所以,下面我们试图聚合各位,一起参透这个话题:
如何签名?
找谁签名?
到底如何操作?
能不能自己给自己签名?
[尝试一] David Hayes的MIDlet jar signing tutorial可行吗?
David Hayes在他的Blog中提到了一个办法,毫无疑问,他是试验成功了的。
他给出了一个《MIDlet jar signing (a tutorial) ,
http://www.spindriftpages.net/pebble/dave/2005/06/20/1119275880301.html 》,文后的评论中,他还补充说了“经过这样的签名后,你必须通过OTA方式或者其他方式,让手机安装签名后的JAD,而不是仅仅通过上传JAR来安装。只有通过JAD安装方式,这种签名才会奏效”。
不幸的是,我试验不出来。签名之后,JAD中倒是多了这么一段:
MIDlet-Certificate-1-1
|
MIDlet-Certificate-1-1: MIICTjCCAbcCBEQ06RcwDQYJKoZIhvcNAQEE。。。blabla |
而且我的jar包中的MIMESMSSender.jar\META-INF文件夹下,也多了ZHENGYUN.RSA和ZHENGYUN.SF两个文件;MANIFEST.MF文件中也多了很多这样的东西:
MIDlet-Certificate-1-1
|
Name: res/icons/logo.png SHA1-Digest: 7waVS61BFIfNrpz8/CeyuskUGuU=
Name: res/icons/exit.png SHA1-Digest: L+8Kb/TeuRUpWsq5qrU9epu5Srw=
|
但是都没用。
有的网友说这个方法在手机上安装,遇到了“Authorisation Failed”错误提示,而David说
Authorisation Failed
|
I've seen Authorisation Failed a few times now. Typically rebooting the phone (and taking the battery out0 fixes it for me. I'ver heard that linebreaks in the permissions attribute in the Manifest can cause problems but it seems ok to me on 6680/6630/6230i(could be firmware dependent?). Maybe you should try a shorter permission string? Other things I have heard cause problems MIDlet-Permissions contains permissions that the phone doesn't support?
|
。
[参考一] motocoder的官方回复
请阅读
https://motocoder.custhelp.com/cgi-bin/motocoder.cfg/php/enduser/std_adp.php?p_faqid=442&p_created=1092167721 上的这段话,看来,如果想使用摩托罗拉的受限制API的话,那么就不能自己签名,只能和他们谈生意了。
论坛贴子之摘录
|
Signing a midlet suite
Question: We have purchased a code signing certificate from verisign to sign our midlet. However it does not appear to work. The certificate we received back from verisign is a chain of certificates. Can you look at the certificate and tell me if it should work i.e. is the root CA for the cert on the phone. If I need to add additional 'Midlet-Certificate' entries in the jad can you please advise on what they should be.
Answer: The issue is that you can not purchase a certificate through Verisign or any other Authority and sign the midlet yourself - it will not work.
You need to go through Motorola in order to get this done, but it will only be done if there is a business relationship with Motorola and your company. |
也就是说,摩托罗拉的策略是,他的手机不允许你自己签名!而必须通过摩托罗拉自己来做。
[参考二] 如何和摩托罗拉办理签名手续
请阅读
论坛贴子之摘录
|
我总结一下步骤: 1. 如果你没有NDA,那么请到MOTOcoder.com的首页,上面有一个“Innovate”的链接,在这里提交申请。 2. 确定你的公司和摩托罗拉之间有一个有效的NDA (Non Disclosure Agreement)!而且必须是和Motorola Mobile Devices Business or PCS (Personal Communications Sector)的协议! 3. 告诉摩托罗拉你的应用(MIDlet)需要在哪些设备上运行! 4. 告诉摩托罗拉为什么要提出Signing Request?你的应用都要使用到哪些受限制的API? 5. 通知Motorola Business Sponsor。通过motocoder站点的“Ask A Question”这个链接来提交。
|
[参考3] 用证书权威机构的证书签署Midlet
作者 dingjf7516
http://www.j2medev.com/bbs/dispbbs.asp?BoardID=2&ID=7622&replyID=38045&skin=1
一:证书权威机构以及证书的选择策略
1:确定目标手机是否实现了第三方信任域,是否支持证书权威机构的证书。
多数Moto的手机不支持证书权威机构的证书,不支持Java Verified的认证。我个人只能确定大部分诺基
亚和索爱的手机是支持的。
2:确定目标手机安装了该证书权威机构的根证书。
因为验证的过程需要从JAD属性包含的证书路径追溯到安装在手机上根证书,所以在选择证书权威机构之
前,必须确认目标手机上安装了该机构的根证书。一般认为最通用的是Verisign,其次是Thawte。
3:向选定的证书权威机构申请正确的证书。
这些机构一般提供多种的安全证书,必须选择正确的证书。对于Midlet,应该选择java code signing证
书。
4:关于价格。
据我个人了解,Verisign的一年有效期的证书是400$,Thawte是199$,我们最后选择的是Thawte的。
二:相关keytool 命令简介
1:生成公用/私用密钥
keytool -genkey
2:生成CSR(certificate signing Request)
keytool -certreq
3:导入证书
keytool -import
三:wtk签署的步骤说明
1:打开工程执行build和package
2:菜单project-》Sign-》import keypair,选择用keytool导入了证书的keystore
3:sign midlet suite
四:向证书权威机构申请购买证书的流程。
1:用keytool生成CSR
2:登录Thawte的网站。
3:注册购买java code signing证书,按照提示流程填写相关信息,其中包含CSR。
4:提供公司注册证明和公司电话号码的证明,等待对方验证。
5:完成相关证明的验证后,Thawte会把证书放在网页上,下载得到签署者证书。
[参考4] 用自制证书签署Midlet
作者 dingjf7516
抱歉,前面关于购买证书的流程,忘记了最重要的一步,付款。不给钱是不行的哟。:)
一:自制证书签署是否可行?
1:无论David Hayes还是诺基亚论坛的网友random john doe,都需要把自制的根证书安装到手机上。所
以用自制证书签署Midlet的前提是手机支持某种方法可以让用户安装证书到第三方信任域。而具有这种功
能的手机并不多。
2:JSR118-MIDP2.0规范规定,“Third party Protection Domain Root Certificates downloaded
after device manufacture MUST NOT be used for
authentication of MIDlet suites.”也就是后安装的证书是不可以用来验证Midlet的证书和数字签名的
。
所以,如果在S60上可以用自制证书将安装到第三方信任域的话,说明该手机的安全机制的实现是不符合
规范的,可能带来安全问题。
3:我个人没有验证过自制证书签署Midlet,所以只是对David Hayes和John Doe如何做给出一个介绍。
二:David Hayes的方法
1:keytool生成公用/私用密钥。
2:keytool -export导出自制根证书。
3:安装根证书到手机。
4:build并packageMidlet
5:jarsigner修改jar。
6:jadtool加入证书。
7:jadtool加入数字签名。
三:John Doe的方法
1:keytool生成公用/私用密钥。
2:keytool -selfcert生成自制的根证书。
3:keytool -export 导出根证书。
4:安装根证书到手机。
5:build并packageMidlet
6:用WTK签署Midlet,加入证书和数字签名。
比较两个人的做法,David Hayes没有keytool -selfcert自制证书的步骤,而多了jarsigner把签名写入
jar的步骤。相比较之下,John Doe的做法可能更正确一些。
在John Doe的帖子中,schnejan表示6600的版本必须是4.09.1或以后,daniele.pinto表示Midlet不能用
到precompile library。
不过手机的中文版和英文版也可能是不同的,需要大家自己去验证。:)