• 【OpenHarmony】系统应用权限管控与签名


    一、背景

    • 当前OpenHarmony系统,给应用层提供的部分接口是系统接口,所谓系统接口就是只允许系统应用调用,不允许三方应用调用的接口。
    • 那么这个只允许系统应用调用,这个限制到底是怎么落实到系统中的呢?
    • 如何定义或者区分系统应用和三方应用呢?

    二、探索

    1、只允许系统应用调用

    • 通过阅读源码,我们发现BundleMgr提供了一个方法CheckIsSystemAppByUid,可以用来判断该应用是不是系统应用。起用法如下:
      • 首先我们要获取到 BundleMgr实例,如下:
    static sptr<IBundleMgr> GetBundleMgr()
    {
        auto sam = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
        if (sam == nullptr) {
            USB_HILOGW(MODULE_USB_SERVICE, "GetSystemAbilityManager return nullptr");
            return nullptr;
        }
        auto bundleMgrSa = sam->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
        if (bundleMgrSa == nullptr) {
            USB_HILOGW(MODULE_USB_SERVICE, "GetSystemAbility return nullptr");
            return nullptr;
        }
        auto bundleMgr = iface_cast<IBundleMgr>(bundleMgrSa);
        if (bundleMgr == nullptr) {
            USB_HILOGW(MODULE_USB_SERVICE, "iface_cast return nullptr");
        }
        return bundleMgr;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 然后我们获取到调用当前系统接口的应用uid,将该uid传给CheckIsSystemAppByUid来判断其是否是系统应用。
    bool UsbRightManager::IsSystemHap()
    {
        pid_t uid = IPCSkeleton::GetCallingUid();
        auto bundleMgr = GetBundleMgr();
        if (bundleMgr == nullptr) {
            USB_HILOGW(MODULE_USB_SERVICE, "BundleMgr is nullptr, return false");
            return false;
        }
        return bundleMgr->CheckIsSystemAppByUid(uid);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 这样我们就能知道调用我们接口的应用到底是不是系统应用。如果不是系统应用直接返回相应错误,不走正常业务逻辑,就能够达到我们的目的了。

    2、制作一个普通应用

    • 当前deveco工具编译、自动签名出来的应用默认是普通应用,所以我们可以按照官方教程自动签名,即可得到普通应用。

    3、制作一个系统应用

    • 首先需要说明下,OpenHarmony上系统应用和普通应用是通过签名来区分的,上面自动签名得到的是普通应用,所以我们想要得到系统应用就需要手动签名。官方签名教程在这里
    • 这里我写一个简易版教程:
      • 首先检查环境配置:
        • python3 --version如果没有安装,请自行安装,python官网
        • java -version 如果没有安装,请自行安装,java官网
        • gradle -v 如果没有安装,请自行安装,建议安装Gradle 7.1,gradle官网
      • 然后下载签名工具,将这个仓下载下来developtools_hapsigner
      • 接着编译hap-sign-tool.jar,如下(选自官方教程):
        1、该工具基于Gradle 7.1编译构建,请确认环境已安装配置Gradle环境,并且版本正确
        gradle -v
        2、命令行打开文件目录至developtools_hapsigner/hapsigntool,执行命令进行编译打包
        gradle build 或者 gradle jar
        3、编译后得到二进制文件,目录为: ./hap_sign_tool/build/libs/hap-sign-tool.jar
        
        • 1
        • 2
        • 3
        • 4
        • 5
      • 修改autosign/UnsgnedReleasedProfileTemplate.json文件中的app-feature值为ohos_system_app,bundle-name值为自己应用的包名,可以在应用工程的AppScope/app.json5文件中查看包名;有些接口对apl要求较高,如有需要可将apl值改为system_core如下
        "bundle-name": "自己应用的包名",
        "apl": "system_core",
        "app-feature": "ohos_system_app"`
        
        • 1
        • 2
        • 3
      • 将待签名的应用命名为app1-unsigned.hap放到autosign/目录下。
      • 然后分别执行create_appcert_sign_profile.batsign_hap.bat脚本,就会在目录developtools_hapsigner-master/autosign/result下生成一个名为app1-signed.hap的已签名的系统应用。
    • 第二次签名的时候,有可能会报错。这种情况下,需要执行git checkout autosign/result/OpenHarmony.p12回退OpenHarmony.p12文件的修改。然后再次执行create_appcert_sign_profile.batsign_hap.bat。后续签名只需要执行sign_hap.bat

    三、总结

    • 底层由BundleMgr提供了判断是否是三方应用的能力。
    • 上层是否是系统应用取决于签名时的app-feature字段,如果是hos_normal_app则为普通应用,是ohos_system_app则为系统应用。

    四、参考资料

    1、deveco官方下载:https://developer.harmonyos.com/cn/develop/deveco-studio
    2、OpenHarmony包签名工具:https://gitee.com/openharmony/developtools_hapsigner
    3、gradle安装与使用:https://gradle.org/install/#manually

  • 相关阅读:
    排序---堆排
    [linux] ModuleNotFoundError: No module named ‘torch.utils._pytree‘ 报错怎么解决
    java基础之jvm4
    three.js调试工具dat.gui使用
    Go Web开发GoFrame+Vue+ElementUI框架实战教程
    数据结构与算法:二分查找(心得)
    使用 prometheus 监控 MySQL
    搭建伪分布式Hadoop
    万应低代码11月重点更新内容速递
    新闻网站封锁AI爬虫 AI与新闻媒体博弈继续
  • 原文地址:https://blog.csdn.net/C2681595858/article/details/126879656