你如何签署Java Midlet?

2022-09-04 07:19:28

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

如何对 Java Midlet 进行签名,以便将其加载到手机上,同时减少安全提示?


答案 1

获取所需的软件

  1. 来自 SunJava SDK (JDK)(你应该已经拥有了这个)
  2. Java Wireless Toolkit (WTK) 也来自 Sun
  3. (可选)获取并安装 AntAntenna,以允许您自动构建(我强烈建议使用这些)

导入现有证书(如果有)

  1. 如果您从威瑞信(或其他提供商)购买了证书,则需要将证书导入到 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,特别注意类路径和引导类路径选项(否则预处理将失败)。我还将目标设置为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 的 MF 文件,您必须删除 MIDlet-Jar 大小和MIDlet-Jar-URL
  4. 这两个任务都可以使用wtkJad天线任务完成
  5. 使用 wtkPackage Antenna 任务打包和预处理应用,您必须正确设置类路径和引导类路径属性,否则预处理将失败

对应用程序进行签名

  1. 使用 jarsigner 对应用程序进行签名
  2. jarsigner -keystore {mykeystore} -storepass (mypassword} {myjar} {myalias}
  3. 现在你有一个签名的 jar,你需要在 JAD 中更新MIDlet-Jar-Size
  4. 现在使用 JadTool 将证书添加到 JAD.jar来自 WTK
  5. java -jar JadTool.jar -addcert -alias {myalias} -storepass {mypassword} -keystore {mykeystore} -inputjad {myinputjad} -outputjad {myoutputjad}
  6. 现在使用 JadTool 再次将签名添加到 JAD.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)发送文件。注意:我还没有找到在40系列手机上导入证书的方法
  2. 安装证书后,需要授权它进行“应用程序安装”。在我的手机(诺基亚6680)上,这是在工具 - >设置 - >证书管理 - >信任设置下,我打开了所有内容,但我认为“应用程序安装”就是您所需要的

常见问题

  1. 未使用 JAD 安装的应用程序:仅当使用 JAD 安装应用程序时,应用程序才受信任,应用程序仍将从 jar 安装,但不会受信任。
  2. 未设置应用程序信任设置:安装应用程序后,您需要指定要为其授予的信任程度(默认情况下,它不会获得所有权限)。在诺基亚 60 系列手机上,这些都可以在应用程序管理器下找到。
  3. 手机中缺少根证书:某些手机缺少 Java 验证证书和/或威瑞信证书,请在相关证书的工具>设置>证书管理下进行检查
  4. 授权失败: - 这背后有很多可能的原因,这是我遇到的
    1. 手机中缺少证书,请仔细检查您的证书是否已安装,并且已在证书管理中标记为受信任的应用程序安装
    2. 重新启动:完全卸载应用程序,然后重新启动手机,尝试将电池和SIM卡也取出,通常事情会变得扭曲,特别是如果您已经重新安装了很多而没有先卸载
    3. JAD/JAR 不匹配:仔细检查 JAD 中的应用程序大小,记住重要的是字节数,而不是磁盘上的大小
    4. 浏览器缓存:如果您通过无线方式安装,请确保在安装之前清除浏览器缓存
    5. 我听说但未验证中的换行可能会导致问题,但在诺基亚6680 / 6630 / 6230i上对我来说似乎没问题(可能取决于固件?MIDlet-Permissions
    6. 该属性是导致许多问题的原因(特别是因为文档通常是错误的/丢失的或因手机而异),请尝试先将其省略,然后一次添加一个权限。有些手机会抱怨他们不支持的权限,有些手机会忽略它们MIDlet-Permissions
  5. 某些早期的诺基亚 6600 固件中存在一个错误,该错误会阻止安装受信任的 MIDlet
  6. 证书尚未生效:如果您自己生成证书,则证书的开始日期可能为明天,此外,如果您的PC和电话日期不同,则可能超出证书的有效期
  7. 40 系列手机上没有证书管理,您可以安装已签名的应用程序,但自签名证书的行为很奇怪
  8. JadTool问题:我没有遇到过这些问题,但很多人都有
    1. “如果我尝试手动使用 jadtool,我会遇到问题。我有一个证书链,似乎无法使用任何WTK jadtool将第二个证书添加到JAD文件中。然而,有趣的是,我可以使用任何相同的WTK GUI接口成功对midlet进行签名 - 它们正确添加了第二个证书。我的步骤:
      1. 使用 1.4.2_06 jarsigner.exe 对 jar 进行签名
      2. 使用 WTK (2.2 或 2.3 beta) jadtool 将证书与 certnum 1 一起添加
      3. 如果我调用 jadtool 来添加带有 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 一个有趣的说明是,cert JAD参数是静态的,所以一旦你正确地从WTK中获取它们,你就可以将它们静态地放在ant脚本中。
    3. “我正在尝试为诺基亚 6620 设备签署 MIdlet。我使用的威瑞信代码签名证书实际上包含两个证书(用户和中间 CA)。我正在使用WTK 2.2签名工具。您知道此工具在签名时是否支持两个证书吗?签名已添加到具有两个证书的JAD文件中,但我在安装时遇到了安全错误。我已经在设备上进行了检查,并且为威瑞信安装了不同的根证书,但它仍然失败了!
    4. “如果你愿意,你可以下载sprintpcs开发人员工具包,因为它支持双证书(http://developer.sprintpcs.com)。但是,我从未获得过在诺基亚(6620 / cingular)手机上工作的证书,尽管它确实可以在sprint手机上工作(启用了开发人员root)。最终,我只能通过创建本博客中描述的证书并将其安装在手机上才能正常工作。奇怪的是,即使我的versign签名证书的根证书*在6620手机上*,它仍然永远不会像你认为的那样安装我的MIDlet。
  9. 旧手机(6230 / i,6682)不支持x509证书,WPKI已被建议为可能的解决方案,但我还没有对此进行调查
  10. 套接字连接可能会有问题(http://discussion.forum.nokia.com/forum/showthread.php?t=68306),可能是由于WAP基础设施和运营商提供的服务。HTTP是一种更安全的协议
  11. “上网查看申请有效期”:是/否。如果我单击是按钮,手机,我会收到以下错误:“此应用程序的证书已吊销”,安装失败。要纠正此问题,请转到工具 - >管理器 - >菜单 - >设置 - >在线Certif检查[开/关/必需]还有一个默认地址设置。如果需要联机控制设置,则如果没有默认地址,则检查将失败。查看 http://discussion.forum.nokia.com/forum/showthread.php?t=71071

信任域

  1. MIDP2 中有 4 个不同的信任域(制造商、运营商、受信任的第三方和不受信任的)。受信任的第三方是我们真正有用的唯一一个。它在我的诺基亚6680(沃达丰英国)上提供了以下选项:
  2. 网络访问:不允许、每次都问、首次询问消息:不允许、每次都问 App 自动启动:不允许、每次都问、首次询问 连接:不允许、每次都问、第一次问、始终允许多媒体:不允许、每次都问、第一次问、第一次问、第一次问 读用户数据:不允许、每次都问、第一次问、 始终允许编辑用户数据:不允许、每次都询问、首次询问、始终允许
  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=

示例清单

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

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


答案 2

步骤 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 步:将您的信息提供给证书颁发机构进行验证。

Step3:您将获得用于代码签名的证书。

Step4:您需要将中间证书与根证书一起下载。

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

推荐