你如何签署Java Midlet?

Dav*_*yes 12 java midlet sign

一个简单的问题,答案相当复杂:

如何签署Java Midlet,以便将其加载到安全提示较少的手机上?

Dav*_*yes 25

获取所需的软件

  1. Java的SDK(JDK)太阳(你应该已经有此)
  2. Java Wireless Toolkit(WTK)也来自Sun
  3. (可选)获取并安装AntAntenna以允许您自动构建(我强烈推荐这些)

导入现有证书(如果有)

  1. 如果您已从Verisign(或其他提供商)购买证书,则需要将证书导入J2SE密钥库.
  2. 尝试使用以下命令keytool -import -alias {myalias} -file {mycertificate}(由于我没有合适的证书,我无法测试这个)
  3. 运行keytool -list以查看新证书
  4. 接下来,您必须导出证书,以便将其导入手机
  5. keytool -export -alias {myalias} -file mycertificate.crt
  6. 将证书导入手机(详见下文)

创建并导入新的(测试)证书

  1. 你需要使用keytool(来自JDK)
  2. 我使用了以下命令 keytool -genkey -alias {myalias} -keyalg RSA -validity 365
  3. 这将提示您输入密钥库密码,输入密钥库密码(如果您有现有密钥库)或者如果您还没有密码库密码则输入密码库密码
  4. 填写有关位置/公司名称等的所有提示.
  5. 运行keytool -list以查看新证书
  6. 接下来,您必须导出证书,以便将其导入手机
  7. keytool -export -alias {myalias} -file mycertificate.crt
  8. 将证书导入手机(详见下文)
C:\j2sdk1.4.2_08\bin>keytool -genkey -alias company -keyalg RSA -validity 365
Enter keystore password: password
What is your first and last name? [Unknown]: My Name
What is the name of your organizational unit? [Unknown]: company
What is the name of your organization? [Unknown]: company
What is the name of your City or Locality? [Unknown]: location
What is the name of your State or Province? [Unknown]: location2
What is the two-letter country code for this unit? [Unknown]: GB
Is CN=My Name, OU=company, O=company, L=location, ST=location2, C=GB correct? [no]: yes
Enter key password for (RETURN if same as keystore password):
Run Code Online (Sandbox Code Playgroud)

构建并打包应用程序

  1. 使用javac来构建你的MIDlet要特别注意你的classpath和启动类路径的选项(否则预验证会失败).我还将目标设置为1.1并将源设置为1.3
  2. 生成JAD文件JAD中的关键属性是MIDlet-Jar-URL,MIDlet-Jar-Size,MIDlet-Permissions我们还包括MIDlet-Icon,MicroEdition-Configuration,MicroEdition-Profile,MIDlet-Name,MIDlet-Push-1 ,MIDlet-Icon,MIDlet-Description和MIDlet-Version
  3. 根据您的JAD生成MANIFEST.MF文件,您必须删除MIDlet-Jar-Size和 MIDlet-Jar-URL
  4. Both these tasks can be completed using the wtkJad Antenna task
  5. Package and preverify the app using the wtkPackage Antenna Task you must set the classpath and bootclasspath properties correctly otherwise Preverification will fail

Sign the application

  1. Sign the Application using jarsigner
  2. jarsigner -keystore {mykeystore} -storepass (mypassword} {myjar} {myalias}
  3. 现在你有了一个签名的jar,你需要更新MIDlet-Jar-Size你的JAD
  4. 现在使用JadTool.jarWTK 将证书添加到JAD
  5. java -jar JadTool.jar -addcert -alias {myalias} -storepass {mypassword} -keystore {mykeystore} -inputjad {myinputjad} -outputjad {myoutputjad}
  6. 现在再次使用添加签名到JAD JadTool.jar
  7. java -jar JadTool.jar -addjarsig -alias {myalias} -jarfile {myjar} -storepass {mypassword} -keypass {mypassword} -keystore {mykeystore} -inputjad {myinputjad} -outputjad {myoutputjad}

部署

  1. 将此部署到正确设置MIME类型的Web服务器并将其下载到您的手机,它将是受信任的第三方应用程序
  2. 您还可以通过蓝牙或红外线或电缆将JAR和JAD发送到手机,根据您的手机功能将应用程序部署到手机.在诺基亚手机上,文件会显示在您的短信收件箱中

在手机上安装证书

  1. 将证书导入手机,在Windows XP SP2中我可以通过右键单击文件并选择"发送到蓝牙设备"来执行此操作,您应该能够通过电缆或红外线(IR)发送文件.注意:我还没有找到在Series 40手机上导入证书的方法
  2. 安装证书后,需要获得"应用程序安装"的授权.在我的手机(诺基亚6680)上,这是在工具 - >设置 - >证书管理 - >信任设置下,我打开了一切,但我认为"应用程序安装"就是你需要的一切

常见问题

  1. 未使用JAD安装应用程序:仅当使用JAD安装应用程序时,应用程序才会受信任,应用程序仍将从jar安装,但不会受信任.
  2. 未设置应用程序信任设置:安装应用程序后,您需要指定提供它的信任程度(默认情况下不会获得所有权限).在诺基亚Series 60手机上,可以在App下找到这些手机.经理.
  3. 电话中缺少根证书:某些电话缺少Java认证证书和/或Verisign证书,请在工具 - >设置 - >证书管理下查看相关证书
  4. 授权失败: - 这里有很多可能的原因,这些是我遇到过的
    1. 电话中缺少证书,请仔细检查您的证书是否已安装,并且已在证书管理中将应用程序安装标记为可信任
    2. 重新启动:完全卸载应用程序然后重新启动手机尝试取出电池和SIM卡,通常情况会变得很糟糕,特别是如果你已经重新安装了很多而没有先卸载
    3. JAD/JAR不匹配:仔细检查JAD中的应用程序大小,记住它是重要的字节数而不是磁盘上的大小
    4. 浏览器缓存:如果您要通过无线方式进行安装,请确保在安装之前清除浏览器缓存
    5. 我听说但没有证实断线MIDlet-Permissions可能会导致问题,但诺基亚6680/6630/6230i对我来说似乎没问题(可能是固件依赖吗?)
    6. MIDlet-Permissions属性是导致许多问题的原因(特别是因为文档经常出错或丢失或根据手机的不同而不同),请先尝试将其删除,然后一次添加一个权限.有些手机会抱怨他们不支持的权限,有些会忽略它们
  5. 一些早期的诺基亚6600固件存在一个错误,可以阻止安装受信任的MIDlet
  6. 证书尚未生效:如果您自己生成证书,它可能具有明天的开始生效日期,如果您的PC和电话日期不同,您可能在证书有效期之外
  7. 在Series 40手机上没有证书管理,您可以安装已签名的应用程序,但自签名证书的行为很奇怪
  8. JadTool问题:我没有遇到任何这些问题,但很多其他人都有
    1. "如果我尝试手动使用jadtool,我会遇到问题.我有一个证书链,似乎无法使用任何WTK jadtool将第二个证书添加到JAD文件中.但有趣的是,我可以成功签署midlet使用任何相同的WTK GUI界面 - 他们正确添加第二个证书.我的步骤:
      1. 使用1.4.2_06 jarsigner.exe来签名jar
      2. 使用WTK(2.2或2.3 beta)jadtool addcert with certnum 1
      3. 如果我将jadtool调用addcert与certnum 2相同的证书被插入作为证书1-2我假设我做错了,因为WTK gui似乎工作得很好"
    2. "我在KVM新闻组上收到一篇帖子,主题是jadtool中有一个错误,作者声称已提交错误报告并发布补丁:http://archives.java.sun.com/cgi -bin/wa?A2 = ind0508&L = kvm-interest&F =&S =&P = 9858还发布了一个有趣的注释:证书JAD参数是静态的,所以一旦你从WTK正确地得到它们,你就可以将它们静态地放在蚂蚁中脚本."
    3. "我正在尝试为诺基亚6620设备签署一个MIdlet.我使用的是Verisign代码签名证书,实际上包含两个证书(用户和中级CA).我使用的是WTK 2.2签名工具.你知道这个工具是否支持两个签名时的证书?签名是用两个证书添加到JAD文件的,但是我在安装时遇到了安全性错误.我检查了设备,并为Verisign安装了不同的根证书,但它仍然失败!
    4. "如果你愿意,你可以下载sprintpcs开发人员工具包,因为它支持双证书(http://developer.sprintpcs.com).但是,我从来没有获得过诺基亚(6620/cingular)手机的证书,尽管它在sprint手机上工作(开发者root已启用).最终,我只是通过创建此博客中所述的证书并将其安装在手机上来完成工作.奇怪的是,即使我的签名证书的根证书*在6620手机上是*,它仍然永远不会像你想象的那样安装我的MIDlet."
  9. 旧手机(6230/i,6682)不支持x509证书,WPKI已被建议作为可能的解决方案,但我没有调查过这个
  10. 由于WAP基础设施和运营商提供的服务,套接字连接可能存在问题(http://discussion.forum.nokia.com/forum/showthread.php?t=68306).HTTP是一种更安全的协议
  11. "上网查看申请有效期":是/否.如果我点击手机上的是按钮,我会收到以下错误:"此应用程序的证书被撤销",安装失败.要解决此问题,请转到工具 - >管理器 - >菜单 - >设置 - >在线证书检查[开/关/必需]还有默认地址设置.如果需要在线控制设置,则检查将失败,如果没有默认地址.请参阅http://discussion.forum.nokia.com/forum/showthread.php?t=71071

信任域

  1. MIDP2中有4个不同的信任域(制造商,运营商,可信第三方和不受信任).值得信赖的第三方是对我们唯一有用的.它在我的诺基亚6680(沃达丰英国)上提供以下选项:
  2. 网络访问:不允许,每次询问,第一次询问消息:不允许,每次应用自动启动时询问:不允许,每次询问,第一次询问连接:不允许,每次询问,第一次询问,始终允许多媒体:不允许,每次询问,第一次询问读取用户数据:不允许,每次询问,第一次询问,始终允许编辑用户数据:不允许,每次询问,第一次询问,始终允许
  3. 这些设置由运营商和电话制造商定义,因此在电话,制造商和运营商之间有所不同.

未解决的问题

  1. 我设法使用J2ME WTK实用程序使用此格式对JAD进行签名,但是当尝试在设备上安装它时,我收到消息"应用程序身份验证失败909".

样本JAD

MIDlet-Jar-URL: MyApp.jar
MIDlet-Jar-Size: 201365
MIDlet-Name: MyApp
MIDlet-Vendor: EC1M
MicroEdition-Profile: MIDP-2.0
MicroEdition-Configuration: CLDC-1.1
MIDlet-Icon: logo.png
MIDlet-Push-1: sms://:6553,net.ec1m.MyApp.midp.MyAppMIDlet,*
MIDlet-Description: MyApp MIDlet
MIDlet-Permissions: javax.microedition.io.PushRegistry,javax.microedition.io.Connector.sms...
MIDlet-Version: 1.0.67 MIDlet-1: MyApp, logo.png,net.ec1m.MyApp.midp.MyAppMIDlet
MIDlet-Certificate-1-1: MIICODCCAaECBEKqpfswDQYJKoZIhvcNAQEEBQAwYz...=
MIDlet-Jar-RSA-SHA1: EUsAch/.../hEZOsJsiCjBOhNs/3FSw4=
Run Code Online (Sandbox Code Playgroud)

样本清单

Manifest-Version: 1.0
MIDlet-Name: MyApp  
Created-By: 1.4.2_05-b04 (Sun Microsystems Inc.)
MIDlet-Push-1: sms://:6553,net.ec1m.MyApp.midp.MyAppMIDlet,*
MIDlet-1: MyApp, logo.png, net.ec1m.MyApp.midp.MyAppMIDlet
MicroEdition-Configuration: CLDC-1.1
Ant-Version: Apache Ant 1.6.2
MIDlet-Icon: logo.png
MIDlet-Vendor: EC1M
MIDlet-Permissions: javax.microedition...
MIDlet-Version: 1.0.67
MicroEdition-Profile: MIDP-2.0
MIDlet-Description: MyApp MIDlet
Run Code Online (Sandbox Code Playgroud)

示例Ant构建文件 我已经将我们的EC1M ant构建文件放在我们的网站上(希望)让这一切变得更加容易. 其他资源FAQ诺基亚论坛是值得一读.