在做移动应用开发时,不管是 Android 还是 iOS,我们都绕不开“签名”这件事。最近我们项目在筹备适配 HarmonyOS NEXT(鸿蒙 Next) 的 SDK,也顺势把鸿蒙的签名机制研究了一遍。这篇文章来分享下。
简单来说,签名的目的是确保应用的来源可信、内容完整、平台可识别。我们开发的应用,最终都要交给系统安装,那系统当然得确认一下:这个包是“你”发的、这包在传输过程中没被篡改、它是我允许安装的对象。这就要靠数字签名。
说到底,数字签名就是:
用私钥对应用包里的内容摘要加密,生成一个签名块,塞进包里。
系统在安装时用你当初的公钥解密它,校验签名是否匹配。如果一切对得上,才会放行。
我们先复习下 Android 和 iOS 的签名流程,再看看鸿蒙的做法是怎么“融合创新”的。
Android 签名机制回顾
搞过 Android 的同学都知道,签名这套流程绕不开 Keystore 文件(.jks 或 .keystore)。它是个密钥库,里面有你生成的一对公私钥。
生成方法嘛,Android Studio 自带的工具或者命令行 keytool 都能搞。你得设置密码、别名、组织机构之类的。
签名流程一般是:
用
apksigner或jarsigner对 APK 进行签名;安装时,系统会从 APK 中提取签名块;
用嵌入的 公钥 验签;
检查包的内容有没有被改动。
重点是——升级包必须用相同密钥签名!
否则就会被系统拦下来,提示你“签名不一致,不能覆盖安装”。
后来 Google 推出了 App Signing by Google Play 服务。你可以只上传未签名的 APK 或用上传密钥签过的 APK,真正的签名工作交给 Google,它用你存的密钥进行最终签名和分发。
iOS 签名机制回顾
iOS 的签名体系就偏“官僚”一点,全靠 Apple 的一套证书系统撑着。
要发布一个 iOS 应用,你得准备这三样东西:
.cer:Apple 颁发的开发者证书,内含你的公钥和身份;.p12:你本地生成的私钥文件,用于签名;.mobileprovision:描述文件,绑定了证书、App ID、设备 ID 等。
整个签名过程和证书链校验基本都在 Apple 的 Xcode 工具和 Apple 服务端完成。只要你照着官方流程来,一般不会出啥问题。
鸿蒙 Next:签名机制融合 Android + iOS 的思路
我们项目要接入鸿蒙 Next,第一件事就是:搞清楚签名密钥这一套怎么玩。研究之后发现,鸿蒙的机制融合了 Android 的密钥库和 iOS 的证书申请体系,整体看起来像是“Android 的私钥管理 + iOS 的证书申请 + 描述文件配置”。
一共涉及 4 个关键文件:
| 文件名 | 用途 | 格式 |
|---|---|---|
| Keystore | 储存公私钥 | .p12 |
| CSR(证书请求) | 提交给华为申请证书 | .csr |
| 数字证书 | 华为签发的开发/发布证书 | .cer |
| 描述文件 Profile | 应用权限、设备、证书绑定等信息 | .p7b |
签名流程详解:一步步把包“合法化”
1. 本地生成 .p12 文件 —— 创建密钥对
你用 DevEco Studio 在本地生成 .p12,里面有一对非对称密钥对(公钥 + 私钥)。
私钥以后用来签名 HAP(HarmonyOS 应用包);
公钥则被嵌入到
.csr文件里,发给华为去申请证书。
2. 生成 .csr 文件 —— 证书请求
.csr 文件是你发给华为的“申请信”,它里面包含了:
你的身份信息(开发者名、组织名等);
你刚刚生成的公钥。
这一点就跟 iOS 的证书申请很像。
3. 提交 .csr 到 AppGallery Connect,申请 .cer 数字证书
这个时候,轮到华为出场了。它会用自己的 CA 私钥 给你签发一张开发证书(.cer 文件)。这个证书里包含:
你的身份信息;
你的公钥;
华为 CA 的签名,确保这张证书是“正宗华为出品”。
通过解析 .csr 的公钥和 .cer 中的开发证书公钥可以发现是同一个。
这样就构建了一条完整的信任链。
4. 构建证书链,验证签名合法性
签了 .cer 后,你的 .p12(公私钥对)就算是“被认证过的开发者密钥”了。系统在安装你签名过的 HAP 包时,会验证:
你的包是不是用这个私钥签的;
这个私钥有没有经过华为签发的证书认证;
这张证书是不是华为签的。
说白了:一层层往上追溯,直到能从信任的 CA 根证书“闭环”,才算合法。
5. 最后一步,生成 .p7b 描述文件 —— 权限、包名、设备绑定
这个 .p7b 文件相当于一个“出入证”,告诉系统这个包:
来自哪个包名;
拥有哪些权限;
是调试包还是发布包;
如果是调试包,哪些设备可以安装;
对应的证书有哪些。
它是以 PKCS#7 格式 打包的,不能少,系统验证的时候会用上。
写在最后
鸿蒙的签名机制说起来复杂,但其实拆开来看就是融合了我们熟悉的 Android 和 iOS 的思路 —— 本地生成密钥,上传公钥申请证书,拿到证书签名包,加上一个描述文件来“做身份认证和权限声明”。
整个流程稍微绕一点,但掌握之后就能把签名流程自动化集成到你的打包流程里。我们现在项目中已经把签名密钥的管理、HAP 签名打包全自动串起来了,做成了 CI/CD 中的一环。
如果你也要做鸿蒙适配,早点熟悉这套流程,绝对事半功倍!
评论