概述
OpenHarmony安全子系统目前提供给开发者的安全能力主要包含应用可信、权限管理、设备可信。涉及以下几个模块:
- 应用验签为了确保应用内容的完整性,系统通过应用签名和Profile对应用的来源进行管控,同时对于调试应用,还可通过验签接口验证应用和设备的UDID是否匹配,确保应用安装在了正确的设备上。
- 应用权限管理应用权限是管理应用访问系统资源和使用系统能力的一种通用方式,应用在开发阶段需要在应用配置文件中指明此应用在运行过程中可能会调用哪些权限,其中静态权限表示只需要在安装阶段注册就可以,而动态权限一般表示涉及到敏感信息,所以需要用户进行动态授权。
- IPC通信鉴权系统服务通过IPC跨进程方式开放的接口,需要对接口调用者进行鉴权操作。在Samgr中注册的系统服务,可以通过进程间通信的方式暴露接口给其他进程访问,同时需要配置相应的访问策略,当其他进程访问这些接口时,将会触发IPC通信鉴权机制校验访问进程是否拥有权限访问该接口,若无权限,则访问会被拒绝。
- 设备安全等级管理OpenHarmony设备安全等级管理(DSLM)模块,负责管理各种不同形态和种类的OpenHarmony设备的设备安全等级。对于OpenHarmony中的各类分布式业务,当其对各类用户数据进行流转或处理的时候,可以调用本模块提供的接口获取相关目标设备的安全等级,并根据获取到的等级进行相应的处理。
- OpenHarmony通用密钥库通用密钥库(HUKS)提供系统级的密钥管理能力,实现密钥全生命周期(生成、存储、使用、销毁)的管理和安全使用,满足生态应用和上层业务的诉求。上层应用可以通过调用本模块提供的接口执行密钥操作,同时明文密钥的存储和使用不能出现在非安全环境中,需要保证在安全环境中使用。
- OpenHarmony SELinuxOpenHarmony结合系统架构特点,基于安全增强式Linux(Security-Enhanced Linux)对OpenHarmony操作系统内文件、参数、SA、HDF等系统资源提供强制访问控制保护能力。
基本概念
在进行依赖验签组件的应用开发前,开发者应了解以下基本概念:
- SamgrSamgr(System Ability Manager)系统能力管理,在OpenHarmony上作为一个管理系统能力的模块,详见系统服务框架子系统。
- BMSBMS(Bundle Manager Service)包管理管理,在OpenHarmony上主要负责应用的安装、卸载和数据管理。
- 授权文件本文中的授权文件,指HarmonyAppProvision,简称profile。HarmonyAppProvision采用json文件格式进行描述。
- 调试应用指开发者从应用市场申请调试证书与调试授权文件,并以此签名的hap包。
- 发布应用指开发者从应用市场申请发布证书与发布授权文件,以此签名的hap包,上传至应用市场,并由应用市场正式发布的hap包。
- OpenHarmony签名应用OpenHarmony开源了一个根CA的证书和密钥,以此根CA签发的签名证书和授权文件签名的应用。
约束与限制
- 仅支持以下三类应用的验签:应用市场调试应用、应用市场发布应用、OpenHarmony签名应用。
- 若对应用市场调试应用验签,则本机UDID需要在授权文件授权调试的UDID列表中。
应用验签开发指导
场景介绍
为了确保应用的完整性和来源可靠,OpenHarmony需要对应用进行签名和验签。
- 应用开发阶段:开发者完成开发并生成安装包后,需要开发者对安装包进行签名,以证明安装包发布到设备的过程中没有被篡改。OpenHarmony的应用完整性校验模块提供了签名工具、签名证书生成规范,以及签名所需的公钥证书等完整的机制,支撑开发者对应用安装包签名。为了方便开源社区开发者,版本中预置了公钥证书和对应的私钥,为开源社区提供离线签名和校验能力;在OpenHarmony商用版本中应替换此公钥证书和对应的私钥。
- 应用安装阶段:OpenHarmony用户程序框架子系统负责应用的安装。在接收到应用安装包之后,应用程序框架子系统需要解析安装包的签名数据,然后使用应用完整性校验模块的API对签名进行验证,只有校验成功之后才允许安装此应用. 应用完整性校验模块在校验安装包签名数据时,会使用系统预置的公钥证书进行验签。
验签流程
未经签名的Hap包的压缩方式是ZIP格式,简单分为文件块,中心目录(Central directory)块,中心目录结尾(EOCD,End of central directory record)块。
经过签名的Hap包,在文件块,和中心目录块之间,插入了签名块。签名块由整包签名数据块(data sign block)、授权文件签名数据块(profile sign block)和签名头(sign head)组成,如下图所示。
图1 经过签名的Hap包结构
整个验签流程,主要分为三部分:整包验签、授权文件验签,以及授权文件内容校验。
整包验签
整包签名数据块是一个PKCS7格式的签名块(signed data),验签过程包括PKSC7签名验证、哈希比较、证书链验证以及证书链与设备预置根证书的匹配校验。
授权文件验签
授权文件数据块是一个PKCS7格式的签名块(signed data),其中PKCS7签名块的内容信息(contentinfo)是授权文件的内容。验签过程包括:PKCS7签名验证、哈希比较、证书链验证以及签发授权文件证书的合法性校验。
授权文件内容校验
验签模块将对授权文件内容进行合法性检查。如果授权文件是调试类型,则会比对本机UDID是否在授权文件授权调试的UDID列表中,如果本机UDID在授权文件授权调试的UDID列表中,则会进一步比较授权文件中的调试证书和整包签名使用的证书是否相同,如果相同,则验证通过。
接口说明
验签组件当前提供innerkits接口,仅供系统应用调用,相关接口及功能描述如下:
表1 轻量级系统验签组件API接口功能介绍
接口名描述int APPVERI_AppVerify(const char *filePath, VerifyResult *verifyRst)主入口函数,输入文件路径,进行验签,并将从描述文件中获取的数据通过verifyRst返回给调用者int APPVERI_SetDebugMode(bool mode)设置测试模式,设置mode为true,则支持基于测试根密钥的证书链校验,设置mode为false,则关闭基于测试根密钥的证书链校验。 注:当前没有基于现有测试根密钥的证书,开发者可根据自身需要,替换测试根密钥并进行相关验证。void APPVERI_FreeVerifyRst(VerifyResult *verifyRst)释放verifyRst中申请的内存
表2 标准系统验签组件API接口功能介绍
接口名描述int HapVerify(const std::string& filePath, HapVerifyResult& hapVerifyResult)校验应用完整性,识别应用来源。
版权归原作者 伤感的猪大肠 所有, 如有侵权,请联系我们删除。