【鸿蒙PC】二进制签名入门:证书从哪来、能要什么权限、该用哪一个
内容提要
鸿蒙PC二进制无合法签名无法运行。签名分三种:自签名仅限本机使用,不能声明权限;调试证书需自行申请,可声明权限并小范围分发,但IDE自动签名无效;二进制证书面向认证开发者,个人难获取。权限分二进制自身与应用侧两层,共享库不能声明权限。强沙箱应用须申请ALLOW_EXTERNAL_NATIVE_CODE,且无法拉起自签名二进制。签名后须chmod +x,勿放/data/local/tmp。
延伸解读
自签名与调试证书的本质区别
自签名(adhoc)不包含任何身份信息,仅校验文件完整性,因此只能在本机运行,且无法声明权限。调试证书由华为颁发,包含开发者身份,可声明权限并分发给指定设备。关键区别在于:自签名是“签给这台机器用”,换机需重签;调试证书则通过 device-ids 绑定设备,实现小范围分发。若需将二进制交给他人测试或声明权限,必须使用自己申请的调试证书,而非 IDE 自动签名。
权限声明的两层结构与限制
二进制权限分为自身权限和应用侧权限。自身权限在二进制的 module.json 中声明,签名时通过 -moduleFile 传入,仅调试证书和二进制证书签名生效,自签名无效。共享库(.so)不能声明权限,必须签可执行程序。应用侧权限决定应用能否拉起二进制,取决于应用沙箱类型:弱沙箱应用自带 CUSTOM_SANDBOX 权限,可拉起任何二进制;强沙箱应用需申请 ALLOW_EXTERNAL_NATIVE_CODE,但仍无法拉起 adhoc 二进制。
交叉编译默认 adhoc 的陷阱
使用 DevEco Studio 的 clang 交叉编译出的二进制默认是 adhoc bin,而非 debug bin。这意味着若想在强沙箱应用中拉起自己编译的二进制,从编译那一刻起就已注定失败,因为强沙箱应用即使申请了 ALLOW_EXTERNAL_NATIVE_CODE 也无法拉起 adhoc bin。必须补一步调试证书签名,将其转为 debug bin。在 HiShell 或弱沙箱应用中则无此限制。
brew 安装软件的执行限制
Harmonybrew 安装的命令行软件通常是 adhoc bin,因为 brew install 在本地下载后自签,无法获取调试证书或二进制证书。这类软件在 HiShell 中可直接运行,但在第三方终端模拟器或工具类应用中,能否执行取决于该应用是否拥有弱沙箱权限 ohos.permission.CUSTOM_SANDBOX。申请 ALLOW_EXTERNAL_NATIVE_CODE 无效,因为强沙箱应用仍无法拉起 adhoc bin。因此,开发此类应用前需确认能否获得 CUSTOM_SANDBOX 权限。
Q&A
鸿蒙PC上二进制签名有哪几种?分别有什么用途?
有三种:自签名(adhoc)仅限本机使用,不能声明权限;调试证书签名需自己申请,可声明权限并小范围分发给指定设备;二进制证书签名面向华为认证开发者,用于公开发布。
调试证书从哪里获取?为什么不能用DevEco Studio的自动签名?
调试证书需自己向华为申请。DevEco Studio的自动签名下发的证书不能用于二进制签名,用它签出来的二进制执行时会被内核拒绝,报Operation not permitted,errno=129。必须使用自己申请的调试证书。
自签名和调试证书签名的主要区别是什么?
自签名只能在本机运行,不能声明权限,换设备需重签;调试证书签名可声明权限,并能分发给device-ids列表中的设备(如同事),但需要设备开启开发者模式。
二进制自己声明权限和应用侧权限有什么不同?
二进制自己的权限写在二进制的module.json中,签名时通过-moduleFile传入,决定程序能否使用底层能力;应用侧权限写在拉起它的应用的module.json中,决定应用能否拉起该二进制。两者层级不同。
在强沙箱应用中拉起二进制需要什么条件?
强沙箱应用必须申请ALLOW_EXTERNAL_NATIVE_CODE权限,否则无法拉起任何独立二进制。即使申请了,也无法拉起adhoc bin(自签名二进制),因为自签名没有身份信息。
别人发来的已签名二进制,如何在自己设备上重新签名使用?
先用llvm-objcopy --remove-section .codesign移除旧签名段,再用binary-sign-tool重新签名,最后chmod 755补回执行位。注意不要遗漏chmod,否则会报Permission denied。
签名后二进制仍然Permission denied,可能是什么原因?
常见原因有两个:一是没有chmod +x补回执行位,签名工具会沿用旧权限位;二是将二进制放在了/data/local/tmp目录,该目录因SELinux标签无法执行。应放在家目录并确保有执行权限。
如何根据需求选择正确的签名类型?
三步判断:1. 要公开发给大批用户→二进制证书;2. 只给自己或小范围分发,但需要声明权限、或要在强沙箱应用中被拉起→自己申请的调试证书;3. 只自己本机用且不需要权限→自签名。注意交叉编译默认生成adhoc bin。