HarmonyOS 鸿蒙Next中如何获取应用签名和appid等信息

HarmonyOS 鸿蒙Next中如何获取应用签名和appid等信息

我使用以下代码获取应用签名信息appid等信息,当使用调试证书签名后,调用该代码可以正常获取签名信息。
当切换为发布证书时,输出只能正常获取bundleName的值  签名信息和appid为空  为什么
bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_SIGNATURE_INFO)
  .then((bundleInfo) => {
    const packageName = bundleInfo.name
    console.log("numberauth:pagname:" + packageName)
    const sign = bundleInfo.signatureInfo.fingerprint
    console.log("numberauth:sign:" + sign)
    const appIdentifier = bundleInfo.signatureInfo.appIdentifier
    console.log("numberauth:appid:" + appIdentifier)
  })

更多关于HarmonyOS 鸿蒙Next中如何获取应用签名和appid等信息的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

【解决方案】

不管是本地调试包还是上架包,签名信息都依赖于密钥库文件(p12文件),只要保证上架的app包使用的和本地调试的hap一样的p12文件,则相关的公钥指纹或者appId都不会发生变化。

  1. 本地调试包获取appId的方式有两种:
import { bundleManager } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';

let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION |
bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_SIGNATURE_INFO;
try {
  bundleManager.getBundleInfoForSelf(bundleFlags).then((bundleInfo: bundleManager.BundleInfo) => {
    console.info('testTag', 'getBundleInfoForSelf successfully. appId: %{public}s', bundleInfo.signatureInfo.appId);
  }).catch((err: BusinessError) => {
    console.error('testTag', 'getBundleInfoForSelf failed. Cause: %{public}s', err.message);
  });
} catch (err) {
  let message = (err as BusinessError).message;
  console.error('testTag', 'getBundleInfoForSelf failed: %{public}s', message);
}
  • 安装应用后通过bm工具获取。参考命令:
hdc shell
# 需将com.example.myapplication替换为实际应用的包名
bm dump -n com.example.myapplication | grep appId

上架包获取appId的方式也有两种:

  • 如前面简述,如果上架包使用的和本地调试包一样的p12文件,则可以参考本地调试包的方式获取appId。
  • 发布邀请测试,从应用市场安装应用,然后通过bm工具获取,该方式也可以进一步验证同一p12编译的软件包appId是一致的。

【背景知识】

HarmonyOS应用经常需要集成一些开放能力,不管是华为开放能力还是三方能力,都需要做鉴权,鉴权的方式根据不同产品提供,一般是通过软件包的签名信息做鉴权,签名信息依赖于证书,而HarmonyOS应用打包有调试正式和发布证书区分,上架应用市场的应用必须用发布证书打包,为了保证应用上架后用户的体验,因此必须配置在架应用的签名信息。签名信息一般可通过公钥指纹和appId来承载。应用相关如:

  1. 华为开放能力使用公钥指纹鉴权,涉及的场景服务有华为账号,应用内支付,钱包服务等。具体的操作步骤可以参见配置公钥指纹。
  2. 如华为账号高德地图使用appId鉴权,具体的获取方式参考bundleInfo.signatureInfo.appId。正确的appId形式为:“包名_签名信息”。

【总结】

  1. 不管是本地调试包还是上架包,签名信息都依赖于密钥库文件(p12文件),只要保证上架的app包使用的和本地调试的hap一样的p12文件,则相关的公钥指纹或者appId都不会发生变化。
  2. 签名信息是唯一的,通过签名信息能很好的完成业务的鉴权,一般表现形式是公钥指纹或appId。部分业务通过fingerprint鉴权,但是使用的签名证书发生变化时,fingerprint也会发生变化。因此涉及到该业务要及时关注fingerprint的值是否正确。

更多关于HarmonyOS 鸿蒙Next中如何获取应用签名和appid等信息的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


【问题定位】

楼主的问题主要是从调试证书切换到发布证书时无法获取APPID

【解决方案】

根据你提供的信息,你已经使用相关代码去获取APPID,但是根据我的开发经验,如果使用了正式发布证书去在手机上是无法运行成功的。那么肯定就没办法获取到基于发布证书的APPID。

本人开发过程中使用的方法供你参考(很详细的步骤,可以耐心阅读或跟着操作):

将你的程序切换到发布证书和发布状态下打包编译,在build目录下找到.app文件上传到AGC的软件包目录,然后把自己添加到邀请测试群组,再去发布邀请测试(切记一定是邀请测试,因为只有邀请测试无需人工审核,能节约很多时间),发布之后通过应用市场中应用尝鲜找到自己的应用(也可以在发布邀请测试的时候选择生成链接通过链接去安装),确保手机与开发工具链接正常,然后在手机上去运行APP,控制台就会打印出你基于发布证书的APPID

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

发布证书不允许读取证书信息的

阿里云的号码认证服务需要使用包名、appid和签名信息生成密钥,如果不能获取,我怎么解决呢?

签名信息使用的是cer文件里的sha256或者sha1,

在HarmonyOS Next中,应用签名信息可通过查看应用配置文件获取。AppID位于项目的AppScope目录下的app.json5文件中,具体字段为"bundleName"。应用签名信息则存储在工程的signing目录下,通过自动生成的.p7b和.cer文件管理。这些信息在应用打包时由开发环境自动处理,无需手动获取。

在HarmonyOS Next中,使用发布证书时签名信息为空是正常现象。这是出于安全机制考虑:发布证书的私钥和签名信息不会存储在设备本地,因此应用运行时无法通过API获取完整的签名指纹和appIdentifier。

调试证书由于用于开发阶段,其签名信息会保留在设备上供调试使用。而发布证书对应正式上架场景,系统会隐藏具体签名内容以防止敏感信息泄露。

当前代码逻辑正确,但需要调整预期:在发布版本中,bundleInfo.signatureInfo下的fingerprint和appIdentifier字段将返回空值。如果业务需要验证应用身份,建议使用其他替代方案,例如通过应用特权配置或服务端校验机制来实现。

回到顶部