当前位置: 首页 > 面试题库 >

您如何签署Java Midlet?

浦毅
2023-03-14
问题内容

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

如何签名Java Midlet,以便可以在安全提示较少的情况下将其加载到手机上?


问题答案:

获取所需的软件

  1. Java的SDK(JDK)从太阳(你应该已经有此)
  2. Java无线工具包(WTK)也从太阳
  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和启动类路径的选项(否则预验证会失败)。我还将目标设置为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图标,MIDlet描述和MIDlet版本
  3. 根据您的JAD生成MANIFEST.MF文件,您必须删除MIDlet-Jar-Size和 MIDlet-Jar-URL
  4. 这两项任务都可以使用wtkJad Antenna任务完成
  5. 使用wtkPackage Antenna Task打包和预验证应用程序,您必须正确设置classpath和bootclasspath属性,否则预验证将失败

签署申请

  1. 使用签署申请 jarsigner
  2. jarsigner -keystore {mykeystore} -storepass (mypassword} {myjar} {myalias}
  3. 现在您有了一个签名的jar,需要更新MIDlet-Jar-SizeJAD中的
  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)发送文件。注意:我仍然找不到在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文件中。但是有趣的是,我可以成功签署Midlet使用任何相同的WTK GUI界面-他们正确添加了第二个证书。
    2. 使用1.4.2_06 jarsigner.exe对jar进行签名
    3. 使用WTK(2.2或2.3 beta)jadtool将certnum为1的addcert
    4. 如果我调用jadtool将certnum 2添加到addcert中,则将相同的证书作为cert 1-2插入,我假设我做错了,因为WTK gui似乎工作正常”
    5. “我在KVM新闻组上收到了有关该主题的帖子,该帖子指出jadtool中存在错误,并且作者声称已提交了错误报告并发布了补丁:http : //archives.java.sun.com/cgi -bin / wa?A2 = ind0508&L = kvm-interest&F =&S =&P = 9858还发布了一个有趣的注释,即cert JAD参数是静态的,因此一旦从WTK中正确获取它们,就可以将其静态地放在ant中。脚本。”
    6. “我正在尝试为诺基亚6620设备签名MIdlet。我正在使用实际上包含两个证书(用户证书和中级CA)的Verisign代码签名证书。我正在使用WTK 2.2签名工具。您知道此工具是否支持两个证书?签名时使用证书?签名是使用两个证书添加到JAD文件中的,但安装时出现安全错误,我在设备上进行了检查,并为Verisign安装了不同的根证书,但仍然失败!
    7. “如果需要,您可以下载sprintpcs开发人员工具包,因为它支持双重证书(http://developer.sprintpcs.com)。但是,尽管它支持诺基亚(6620 / cingular)手机,但我从未获得过该证书可用于确实适用于sprint手机(启用了开发人员root)。最终,我只能通过创建此博客中所述的证书并将其安装在手机上来工作。即使我的签名签名证书的根证书是在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. 这些设置由运营商和电话制造商定义,因此在电话,制造商和运营商之间会有所不同。

未解决的问题

  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-Icon:logo.png
MIDlet供应商:EC1M
MIDlet-权限:javax.microedition ...
MIDlet版本:1.0.67
MicroEdition配置文件:MIDP-2.0
MIDlet描述:MyApp MIDlet

样本Ant构建文件 我已经将我们的EC1M
ant构建文件放在我们的网站上,以(希望)为您简化了所有这些工作。
其他资源
此FAQ诺基亚论坛是值得一读。



 类似资料:
  • 我需要使用256位的私钥为ECDSA的256位散列签名,就像比特币一样。由于缺少python中的ECDSA文档,我感到绝望。 我在网上找到了很多代码,但是没有什么比或类似的,我发现的所有东西都是我不懂的大量数学代码,但他们使用ecdsa库(我不知道为什么他们不在一个库中添加一个用于签名的签名函数,而是在使用库时需要一页代码?)。 这是目前为止我找到的最好的代码: 但我就是不能相信这样的代码,因为我

  • 我正在尝试使用谷歌办公套件设置SAML。但是我得到了这个错误 我已经配置断言应该在我的SP中签名。我可以在其他IDP(如onelogin、okta)中看到签署响应断言的选项。该配置适用于其他IDP,但看不到在谷歌办公套件SAML中唱响应断言的选项。 在Gsuite中,我只能看到签名响应的选项,而不能看到断言。 如何正确设置此设置? SP元数据如下所示:

  • 但是,为了签署请求,openSSL提供了两个工具:ca和X509。然而,这些都不允许使用SHA256。根据官方文档,ca只支持md5、sha1和MDC2。x509仅支持md2、md5、sha1、MDC2。 谢谢你。

  • 将我的第二个应用程序项目上载到PlayStore时,我在上载时遇到以下错误。新版本的aab文件: “您的Android应用程序包使用了错误的密钥进行了签名。请确保您的应用程序包使用了正确的签名密钥进行了签名,然后重试。您的应用程序包应该使用指纹证书进行签名:::” 我所做的是使用我的第一个应用程序的密钥/我的旧密钥库文件,并在Android studio“build”中使用这个密钥库文件- 在游戏

  • 我需要使用外部服务签署pdf文档,该服务将返回PKCS1签名。这意味着我必须在IExternalSignatureContainer实例中添加公钥。我使用iText 7进行整个签名过程。 在iText网站上有一个关于这种方法的很好的例子 我在一个文件中创建了整个演唱过程的示例。必需的引用: null 示例代码(为控制台应用程序准备好的一个文件中的两个类):

  • 在定点数学中,我使用了大量16位信号,并用32位中间结果进行乘法运算。例如: 假设a是一个q14数,那么c与b的比例相同。 这很好,适用于有符号和无符号算术。 问题是:如果我混合类型会发生什么?例如,如果我知道乘数“a”总是在 0.0 到 1.0 之间,那么很容易使其成为无符号的 int q15 以获得额外的精度(并将移位计数更改为 15)。但是,我从来不明白如果您尝试在 C 中将有符号和无符号数