未簽名 MIDlet 存取敏感 API(網路、短信、本地檔案、錄音等)會彈出安全提示框,嚴重影響使用者體驗。簽名的本質是身份認證與權限授予:由受信任的根憑證機構(CA)驗證開發者身份,並由裝置製造商/營運商將對應根憑證預置於手機信任域中,才能實現「免提示」存取。
| 流派 | 核心機制 | 適用場景 | 成本/門檻 |
|---|---|---|---|
| CA 憑證簽名 (VeriSign/Thawte) | 購買 Java Code Signing 憑證 → WTK/jarsigner 簽名 → JAD 內嵌憑證鏈 | Nokia、Sony Ericsson 等支援第三方信任域的機型 | 年費 $199-$400,需公司實名認證 |
| 廠商簽名 (Motorola/Nokia Signed) | 提交應用至廠商門戶 → 商務合作/NDA → 廠商私鑰簽名 | Motorola 強制;Nokia 可選 | 需商務關係、NDA、技術審核,週期長 |
| 自簽名 (Self-signed + 手動安裝根憑證) | keytool 自產根憑證 → 手機安裝根憑證 → 簽名 MIDlet | 僅限開發測試、企業內部分發、特定支援裝置 | 免費但受 JSR 118 規範限制(裝置出廠後安裝的根憑證不可用於 MIDlet 驗證) |
MIDlet-Certificate-1-1: MIICTjCCAbcCBEQ06RcwDQYJKoZIhvcNAQEE... (Base64 編碼憑證)
MIDlet-Jar-RSA-SHA1: xxxxx... (JAR 內容簽名)
MIDlet-Permissions: javax.microedition.io.Connector.http, javax.microedition.io.Connector.sms.send
# 1. 產生金鑰對
keytool -genkey -alias mykey -keystore my.keystore
# 2. 產生 CSR(憑證簽名請求)
keytool -certreq -alias mykey -keystore my.keystore -file my.csr
# 3. CA 簽發後匯入憑證鏈
keytool -import -alias rootca -keystore my.keystore -file rootca.cer # 根憑證
keytool -import -alias mykey -keystore my.keystore -file my_signed.cer # 簽發憑證
官方明確回覆:無法購買 VeriSign 憑證自行簽名,必須透過 Motorola 官方流程,且需公司層面 NDA 與商務贊助。此策略導致大量獨立開發者放棄 Motorola 平台。
大多數機型預置 VeriSign/Thawte 根憑證,支援標準 Java Verified 計畫。開發者購買憑證即可自行簽名部署,OTA 安裝時需提供 JAD(而非單純 JAR)。
「裝置製造後下載的第三方保護域根憑證,不得用於 MIDlet 套件的驗證。」
若 S60 允許自簽名通過,說明該裝置實作不符合規範,存在安全風險。生產環境嚴禁使用自簽名。
MIDlet-Permissions / MIDlet-Permissions-Opt,避免請求裝置不支援的權限導致「Authorization Failed」J2ME 簽名體系是行動應用安全分發的早期探索,其核心痛點——碎片化的信任錨點、高昂的憑證成本、廠商壟斷式控制——在 Android (Play App Signing)、iOS (App Store 憑證) 時代以平台級強制統一形式得到解決。理解這段歷史,有助於把握現代行動應用安全架構的演進邏輯。