你如何签署Java Midlet?
一个简单的问题,答案相当复杂:
您如何签署Java Midlet,以便将其加载到安全提示较少的手机上?
获取所需的软件
- Sun的 Java SDK(JDK) (你应该已经有了这个)
- Java Wireless Toolkit(WTK)也来自Sun.
- (可选)获取并安装Ant和Antenna以允许您自动构建(我强烈推荐这些)
导入现有证书(如果有)
- 如果您从Verisign(或其他提供商)购买了证书,则需要将证书导入J2SE密钥库。
- 尝试使用以下命令
keytool -import -alias {myalias} -file {mycertificate}
(由于我没有合适的证书,我无法测试这个) - 运行
keytool -list
以查看新证书 - 接下来,您必须导出证书,以便将其导入手机
- 运行
keytool -export -alias {myalias} -file mycertificate.crt
- 将证书导入手机(详见下文)
创建并导入新的(测试)证书
- 你需要使用keytool (来自JDK)
- 我使用以下命令
keytool -genkey -alias {myalias} -keyalg RSA -validity 365
- 这将提示您输入密钥库密码,输入密钥库密码(如果您有现有密钥库)或者如果还没有密码库密码则输入密码库密码
- 填写有关位置/公司名称等的所有提示。
- 运行
keytool -list
以查看新证书 - 接下来,您必须导出证书,以便将其导入手机
- 运行
keytool -export -alias {myalias} -file mycertificate.crt
- 将证书导入手机(详见下文)
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):
构建并打包应用程序
- 使用
javac
构建MIDlet,特别注意classpath和bootclasspath选项(否则预validation将失败)。 我还将目标设置为1.1并将源设置为1.3 - 生成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
- 根据您的JAD生成MANIFEST.MF文件,您必须删除MIDlet-Jar-Size和
MIDlet-Jar-URL
- 这两个任务都可以使用wtkJad Antenna任务完成
- 使用wtkPackage天线任务打包并预validation应用程序您必须正确设置classpath和bootclasspath属性,否则预validation将失败
签署申请
- 使用
jarsigner
签署应用程序 - 运行
jarsigner -keystore {mykeystore} -storepass (mypassword} {myjar} {myalias}
- 现在你有一个签名的jar你需要更新你的JAD中的
MIDlet-Jar-Size
- 现在使用WTK中的
JadTool.jar
将证书添加到JAD - 运行
java -jar JadTool.jar -addcert -alias {myalias} -storepass {mypassword} -keystore {mykeystore} -inputjad {myinputjad} -outputjad {myoutputjad}
- 现在使用
JadTool.jar
再次将签名添加到JAD - 运行
java -jar JadTool.jar -addjarsig -alias {myalias} -jarfile {myjar} -storepass {mypassword} -keypass {mypassword} -keystore {mykeystore} -inputjad {myinputjad} -outputjad {myoutputjad}
部署
- 将此部署到正确设置MIME类型的Web服务器并将其下载到您的手机,它将是受信任的第三方应用程序
- 您还可以通过蓝牙或红外线或电缆将JAR和JAD发送到手机,根据您的手机function将应用程序部署到手机。 在诺基亚手机上,文件会显示在您的短信收件箱中
在手机上安装证书
- 将证书导入手机,在Windows XP SP2中我可以通过右键单击文件并选择“发送到蓝牙设备”来执行此操作,您应该能够通过电缆或红外线(IR)发送文件。 注意:我还没有找到在Series 40手机上导入证书的方法
- 安装证书后,需要获得“应用程序安装”的授权。 在我的手机(诺基亚6680)上,这是在工具 – >设置 – >证书管理 – >信任设置下,我打开了一切,但我认为“应用程序安装”就是您所需要的一切
常见问题
- 未使用JAD安装应用程序:仅当使用JAD安装应用程序时,应用程序才会受信任,应用程序仍将从jar安装,但不会受信任。
- 未设置应用程序信任设置:安装应用程序后,您需要指定提供它的信任程度(默认情况下不会获得所有权限)。 在诺基亚Series 60手机上,可以在App下找到这些手机。 经理。
- 电话中缺少根证书:某些电话缺少Java认证证书和/或Verisign证书,请在工具 – >设置 – >证书管理下查看相关证书
- 授权失败: – 这里背后有很多可能的原因是我遇到过的
- 电话中缺少证书,请仔细检查您的证书是否已安装,并且已在证书管理中将应用程序安装标记为可信任
- 重新启动:完全卸载应用程序,然后重新启动手机尝试将电池和SIM卡取出来,通常情况会变得很糟糕,特别是如果你已经重新安装很多而没有先卸载
- JAD / JAR不匹配:仔细检查JAD中的应用程序大小,记住它是重要的字节数而不是磁盘上的大小
- 浏览器缓存:如果您要通过无线方式进行安装,请确保在安装之前清除浏览器缓存
- 我听说但是没有validation
MIDlet-Permissions
中的换行符会导致问题,但对诺基亚6680/6630 / 6230i来说似乎没问题(可能与固件有关吗?) -
MIDlet-Permissions
属性是导致许多问题的原因(特别是因为文档经常出错或丢失或根据手机的不同而不同),请先尝试将其删除,然后一次添加一个权限。 有些手机会抱怨他们不支持的权限,有些会忽略它们
- 一些早期的诺基亚6600固件存在一个错误,可以阻止安装受信任的MIDlet
- 证书尚未生效:如果您自己生成证书,它可能具有明天的开始有效日期,如果您的PC和电话日期不同,您可能在证书有效期之外
- 在Series 40手机上没有证书管理,您可以安装已签名的应用程序,但自签名证书的行为很奇怪
- JadTool问题:我没有遇到任何这些问题,但很多其他人都有
- “如果我尝试手动使用jadtool,我会遇到问题。我有一个证书链,似乎无法使用任何WTK jadtool将第二个证书添加到JAD文件中。但有趣的是,我可以成功签署midlet使用任何相同的WTK GUI界面 – 他们正确添加第二个证书。我的步骤:
- 使用1.4.2_06 jarsigner.exe来签名jar
- 使用WTK(2.2或2.3 beta)jadtool addcert with certnum 1
- 如果我将jadtool调用addcert与certnum 2相同的证书被插入作为证书1-2我假设我正在做错误的事情,因为WTK gui似乎工作得很好“
- “我收到了KVM新闻组关于该主题的post,该post声称jadtool中存在错误,作者声称已提交错误报告并发布补丁: http : //archives.java.sun.com/cgi -bin / wa?A2 = ind0508&L = kvm-interest&F =&S =&P = 9858还有一个有趣的注意事项是,证书JAD参数是静态的,所以一旦你从WTK正确地得到它们,你就可以将它们静态地放在ant中脚本。”
- “我正在尝试为诺基亚6620设备签署一个MIdlet。我使用的是Verisign代码签名证书,实际上包含两个证书(用户和中级CA)。我使用的是WTK 2.2签名工具。你知道这个工具是否支持两个签名时的证书?签名是用两个证书添加到JAD文件的,但是我在安装时遇到了安全性错误。我已经检查了设备,并且为Verisign安装了不同的根证书,但它仍然失败!
- “如果你愿意,你可以下载sprintpcs开发人员工具包,因为它支持双重证书( http://developer.sprintpcs.com )。但是,我从来没有获得过诺基亚(6620 / cingular)手机的证书,尽管它在sprint手机上工作(启用了开发人员root)。最终,我只通过创建此博客中描述的证书并将其安装在手机上来完成工作。奇怪的是,即使我的签名证书的根证书*在6620手机上是*,它仍然永远不会像你认为的那样安装我的MIDlet。“
- “如果我尝试手动使用jadtool,我会遇到问题。我有一个证书链,似乎无法使用任何WTK jadtool将第二个证书添加到JAD文件中。但有趣的是,我可以成功签署midlet使用任何相同的WTK GUI界面 – 他们正确添加第二个证书。我的步骤:
- 旧手机(6230 / i,6682)不支持x509证书,WPKI已被建议作为可能的解决方案,但我没有调查过这个
- 由于WAP基础设施和运营商提供的服务,套接字连接可能存在问题( http://discussion.forum.nokia.com/forum/showthread.php?t=68306 )。 HTTP是一种更安全的协议
- “上网查看申请有效期”:是/否。 如果我点击手机上的是按钮,我会收到以下错误:“此应用程序的证书被撤销”,安装失败。 要解决此问题,请转到工具 – >管理器 – >菜单 – >设置 – >在线证书检查[开/关/必需]还有一个默认地址设置。 如果需要在线控制设置,则检查将失败,如果没有默认地址。 请参阅http://discussion.forum.nokia.com/forum/showthread.php?t=71071
信任域
- MIDP2中有4个不同的信任域(制造商,运营商,可信第三方和不受信任)。 值得信赖的第三方是对我们唯一有用的。它在我的诺基亚6680(沃达丰英国)上提供以下选项:
- 这些设置由运营商和电话制造商定义,因此在电话,制造商和运营商之间有所不同。
网络访问:不允许,每次询问,第一次询问消息:不允许,每次App自动启动:不允许询问,每次询问,第一次询问连接:不允许,每次询问,第一次询问,始终允许多媒体:不允许,每次询问,第一次询问读取用户数据:不允许,每次询问,第一次询问,始终允许编辑用户数据:不允许,每次询问,第一次询问,始终允许
尚未解决的问题
- 我设法使用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步:创建可能引发的CSR请求
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