你如何签署Java Midlet?

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

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

获取所需的软件

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

导入现有证书(如果有)

  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): 

构建并打包应用程序

  1. 使用javac构建MIDlet,特别注意classpath和bootclasspath选项(否则预validation将失败)。 我还将目标设置为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. 这两个任务都可以使用wtkJad Antenna任务完成
  5. 使用wtkPackage天线任务打包并预validation应用程序您必须正确设置classpath和bootclasspath属性,否则预validation将失败

签署申请

  1. 使用jarsigner签署应用程序
  2. 运行jarsigner -keystore {mykeystore} -storepass (mypassword} {myjar} {myalias}
  3. 现在你有一个签名的jar你需要更新你的JAD中的MIDlet-Jar-Size
  4. 现在使用WTK中的JadTool.jar将证书添加到JAD
  5. 运行java -jar JadTool.jar -addcert -alias {myalias} -storepass {mypassword} -keystore {mykeystore} -inputjad {myinputjad} -outputjad {myoutputjad}
  6. 现在使用JadTool.jar再次将签名添加到JAD
  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发送到手机,根据您的手机function将应用程序部署到手机。 在诺基亚手机上,文件会显示在您的短信收件箱中

在手机上安装证书

  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. 我听说但是没有validationMIDlet-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新闻组关于该主题的post,该post声称jadtool中存在错误,作者声称已提交错误报告并发布补丁: http : //archives.java.sun.com/cgi -bin / wa?A2 = ind0508&L = kvm-interest&F =&S =&P = 9858还有一个有趣的注意事项是,证书JAD参数是静态的,所以一旦你从WTK正确地得到它们,你就可以将它们静态地放在ant中脚本。”
    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. 网络访问:不允许,每次询问,第一次询问消息:不允许,每次App自动启动:不允许询问,每次询问,第一次询问连接:不允许,每次询问,第一次询问,始终允许多媒体:不允许,每次询问,第一次询问读取用户数据:不允许,每次询问,第一次询问,始终允许编辑用户数据:不允许,每次询问,第一次询问,始终允许

  3. 这些设置由运营商和电话制造商定义,因此在电话,制造商和运营商之间有所不同。

尚未解决的问题

  1. 我设法使用J2ME WTK实用程序使用此格式对JAD进行签名,但是当尝试在设备上安装它时,我收到消息“应用程序身份validation失败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= 

样本清单

 清单 - 版本:1.0
 MIDlet-Name:MyApp  
创建者: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供应商:EC1M
 MIDlet-Permissions:javax.microedition ...
 MIDlet版本:1.0.67
 MicroEdition-Profile:MIDP-2.0
 MIDlet-Description:MyApp MIDlet

示例Ant构建文件我已经将我们的EC1M ant构建文件放在我们的网站上(希望)让这一切变得更容易。 其他资源 诺基亚论坛上的这个常见问题解答值得一读。

第1步:创建可能引发的C​​SR请求

 1) Creating keystore and using that generate CSR file. 2) Perform steps given by certificate authority and download CSR and private key files. 

第2步:将您的信息提供给证书颁发机构进行validation。

第3步:您将获得代码签名证书。

步骤4:您需要下载中间证书和根证书。

Step5:现在你将拥有your_domain_name.crt,IntCertCA.crt,TrustedRoot.crt

 Now you need to create a chained certificate by combining all above certificates. 1) Open a text editor (such as wordpad) and paste the entire body of each certificate into one text file in the following order: The Primary Certificate - your_domain_name.crt The Intermediate Certificate - IntCertCA.crt The Root Certificate - TrustedRoot.crt Make sure to include the beginning and end tags on each certificate. The result should look like this: -----BEGIN CERTIFICATE----- (Your Primary SSL certificate: your_domain_name.crt) -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- (Your Intermediate certificate: IntCertCA.crt) -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- (Your Root certificate: TrustedRoot.crt) -----END CERTIFICATE----- Save the combined file as your_domain_name.pem. The .pem file is now ready to use. 

步骤6:将私钥导入your_domain_name.pem

  openssl pkcs12 -export -in your_domain_name.pem -inkey your_private_key.key -out output_file_name.p12 -name your_alias NOTE: PLEASE REMOVE \ FROM FOLLOWING COMMANDS AND EXECUTE ( \ IS BASICALLY COMMAND CONTINUETY ) 

步骤7:从output_file_name.p12创建密钥库

  keytool -importkeystore \ -deststorepass changeit -destkeypass changeit -destkeystore your_domain_keystore.ks \ -srckeystore output_file_name.p12 -srcstoretype PKCS12 -srcstorepass your_store_password \ -alias your_alias 

步骤8:注意:请在开始执行命令之前备份您的JAD文件。

  Add your certificates to your your_midlet_name.jad file. java -jar JadTool.jar -addcert -alias your_alias \ -storepass your_store_password \ -keystore your_domain_keystore.ks \ -inputjad your_midlet_name.jad -outputjad your_midlet_name.jad 

步骤9:注意:请在开始执行命令之前备份您的JAD文件。

  Sign your midlet, also use your_midlet_name.jad file generated from Step8. java -jar JadTool.jar -addjarsig \ -alias your_store_password \ -storepass your_store_password \ -keypass your_store_password \ -keystore your_domain_keystore.ks \ -inputjad your_midlet_name.jad -outputjad your_midlet_name.jad