【问题标题】:How do you sign a Java Midlet?如何签署 Java Midlet?
【发布时间】:2010-11-25 21:47:20
【问题描述】:

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

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

【问题讨论】:

  • +1: 我在找这样的东西(+: N00b to J2ME

标签: java midlet sign


【解决方案1】:

获取所需软件

  1. Java SDK (JDK) 来自 Sun(你应该已经有了)
  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):

构建并打包应用程序

  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-版本
  3. 根据您的 JAD 生成 MANIFEST.MF 文件,您必须删除 MIDlet-Jar-Size 和 MIDlet-Jar-URL
  4. 这两项任务都可以使用 wtkJad Antenna 任务完成
  5. 使用 wtkPackage 天线任务打包和预验证应用程序,您必须正确设置类路径和引导类路径属性,否则预验证将失败

签署申请

  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 服务器并将其下载到您的手机,它将成为受信任的第 3 方应用程序
  2. 您还可以根据您的手机功能通过蓝牙或红外线或电缆将 JAR 和 JAD 发送到手机,从而将应用程序部署到手机。在诺基亚手机上的文件 出现在您的短信收件箱中

在手机上安装证书

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

常见问题

  1. 应用程序未使用 JAD 安装:应用程序仅在使用 JAD 安装时才受信任,应用程序仍会从 jar 安装,但不受信任。
  2. 未设置应用程序信任设置:安装应用程序后,您需要指定给予它多少信任(默认情况下它不会获得所有权限)。在诺基亚 60 系列手机上,这些位于应用程序下。经理。
  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. 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. 如果我使用 certnum 2 调用 jadtool 来添加证书,插入的证书与证书 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 正确获取它们,您就可以将它们静态地放在 ant 脚本中。”
    3. “我正在尝试为诺基亚 6620 设备签署一个 MIdlet。我正在使用实际上包含两个证书(用户和中间 CA)的 Verisign 代码签名证书。我正在使用 WTK 2.2 签名工具。你知道这是否工具在签名时支持两个证书?签名被添加到带有两个证书的 JAD 文件中,但安装时出现安全错误。我在设备上检查过,为 Verisign 安装了不同的根证书,但仍然失败!李>
    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. “上网查询申请有效性”:是/否。如果我单击“是”按钮,电话会出现以下错误:“此应用程序的证书已撤销”并且安装失败。要纠正此问题,请转到工具 -> 管理器 -> 菜单 -> 设置 -> 在线证书检查 [开/关/必需] 还有一个默认地址设置。如果需要在线控制设置,如果没有默认地址,则检查将失败。见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=

样品清单

清单版本:1.0
MIDlet 名称: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-配置:CLDC-1.1
Ant 版本:Apache Ant 1.6.2
MIDlet 图标:logo.png
MIDlet-供应商:EC1M
MIDlet 权限:javax.microedition...
MIDlet 版本:1.0.67
微版配置文件:MIDP-2.0
MIDlet 描述:MyApp MIDlet

示例 Ant 构建文件 我已经把我们的EC1Mant build file 放在我们的网站上,以(希望)让这一切对你来说更容易一些。 其他资源 这个FAQ on the Nokia Forum 值得一读。

【讨论】:

  • 我已经安装了它的根证书证书。使用这个 symcaimport.redelijkheid.com/ 现在设置>安全>证书>godaddy>选择使用>有三个选项服务器身份验证。交叉证书应用程序签名其中应用程序签名被禁用..当我安装应用程序并单击它时,它显示无效的应用程序“删除?”我安装的 rot 证书来自 certs.godaddy.com/anonymous/repository.seam Go Daddy Class 2 证书颁发机构根证书(DER 格式),但显示“在电话或 SIM 上找不到证书”
  • 我在我的手机 (Nokia Asha 302) 上安装了证书,但是当我转到 Certificate Management 时,Applications Signing 选项是灰色的,所以当我尝试打开时收到错误 Certificate not on device or SIM它。我该如何启用它?我很绝望!我正在尝试签署一个自制的应用程序 2 天,但我无法让它工作! :(
  • 大部分链接如 sun.java.x@#$% 等都是死链接。你能不能更新一下。另一方面,您的帖子很有帮助。
  • 嗨,我不太可能抽出时间搜索所有死链接并用当前链接替换它们。如果您找到了当前的,请随时编辑我的帖子
【解决方案2】:

第一步: 创建可能由

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

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

第三步: 将为您提供代码签名证书。

第四步: 您需要下载中间证书和根证书。

第五步: 现在您将拥有 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.

第六步: 将私钥导入 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 )

第七步: 从 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      

第九步: 注意:请在触发以下命令之前备份您的 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

【讨论】:

    猜你喜欢
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多