HarmonyOS Next 一文搞懂签名验证机制

背景介绍

Android应用的签名只需要一个签名文件,在开发环境中我们默认是用debug签名,debug签名,debug签名别名是androiddebugkey,密码是android,调试证书存储在用户目录下的.android文件夹中,证书文件通常命名为debug.keystore,在build.gradle中不用专门配置调试签名。HarmonyOS Next采用了类似于iOS签名机制,工程中的签名配置信息在工程级build-profile.json5中,如果使用自动签名,本地生成的签名配置路径会自动更新到build-profile.json5中,这样带来一个问题每人生成的签名路径不一致,在多人协作时build-profile.json5 无法配置git忽略,又无法保持一致。

在Develop Beta6之前,通过在工程中创建sign签名文件夹,使用我自己账号自动签名生成签名文件,将签名文件拷贝到sign文件夹中,别人也可以用我的签名进行开发调试。但是在Develop Beta6开始,共用自动签名生成的签名会导致真机安装失败:

09/06 18:10:04:702: $ hdc shell bm install -p data/local/tmp/140f0b9059b04d8286941346c79d8f7b  in 304 ms
Install Failed: error: failed to install bundle.
code:9568322
error: signature verification failed due to not trusted app source.
View detailed instructions.
09/06 18:10:04:791: $ hdc shell rm -rf data/local/tmp/140f0b9059b04d8286941346c79d8f7b
09/06 18:10:04:792: Launch com.qingkouwei.demo failed, starting handle failure progress
Error while Deploy Hap

因为随着HarmonyOS 系统的迭代逐步趋于稳定,系统开始加强了安全,安装的时候会校验签名的udid和手机的udid是否一致,这样只能继续自动签名,得找到一种彻底的解决方案了。

HarmonyOS 签名机制

要解决问题必须了解签名原理,先来看看自动签名生成的文件有哪些:

  • .p12:密钥,p12证书全称是PKCS#12(Public-Key Cryptography Standards:公钥加密标准,PKCS#12是一种交换数字证书的加密标准,用来描述个人身份信息,包含非对称加密中使用的公钥和私钥,存储在密钥库文件中,公钥和私钥对用于数字签名和验证。

  • .csr:证书请求文件,全称为Certificate Signing Request,包含密钥对中的公钥和公共名称、组织名称、组织单位等信息,用于向AppGallery Connect申请数字证书。

  • .cer:数字证书,由华为AppGallery Connect颁发。

  • .p7b:Profile文件,包含HarmonyOS应用/服务的包名、数字证书信息、描述应用/服务允许申请的证书权限列表,以及允许应用/服务调试的设备列表(如果应用/服务类型为Release类型,则设备列表为空)等内容,每个应用/服务包中均必须包含一个Profile文件。

  • material文件夹:存放签名方案相关材料,如密码、证书等

P12文件和csr文件是本地生成的,用于上传到AppGallery Connect平台申请证书和p7b文件,material文件夹作用后续介绍。

密钥的作用

p12 包含公私钥,是用在非对称加密中,非对称加密(典型的算法如RSA)就是加密密钥和解密密钥是不同的加密方式。典型用法如下:

  • 保密:使用接收人的公钥对明文加密,然后传输给接收人。这样密文只能通过接收人的私钥解密,即便传输过程中密文被截获也是无法解开的,这就保证了信息传输的保密性。

  • 验证身份防篡改(签名):使用发送人的私钥对报文进行加密,就是发送人对报文进行了签名。签名后的报文只能通过发送人的公钥来解密,这就保证了报文的真实性,即报文确实为发送人所属。另外如果密文在传输过程中被截获并修改之后再发送过来,密文无法解密,就知道报文在被篡改了,这样就保证报文的完整性。因此签名的作用就是为了保证报文的真实性和完整性。

数字证书作用

非对称加密算法有一个缺点就是对很长的明文进行加密比较耗时,因此在实际使用中通常都是先将报文通过摘要算法得到摘要,再对摘要进行加密,然后将明文和加密后的摘要以及公钥一同发送出去。接收人先对摘要密文进行解密,再对明文使用摘要算法得到的摘要和解密后摘要进行比对,如果一致则说明明文没有被篡改过。这就是所谓的数字签名,典型的摘要算法有MD5和SHA。

那证书又是什么呢?举个通信过程中欺骗的例子:A为了欺骗B,准备向B发送一份伪造是C发送的报文。A用自己的私钥对文件加密,连同A的公钥一并发给B,并谎称是公钥是C的。那么B怎么知道公钥到时是不是C的呢?这里证书就出场了。证书的存在,必然是为了证明某种事实。四六级证书证明了我的英语水平、身份证证明在国内的唯一身份。数字证书的存在,则是为了证明证书持有者的身份,好比一张网络身份证。数字证书的颁发者是CA(证书机构),受证者即为证书的所有者,可以是企业或个人,也可以是网络设备。数字证书即被CA签过名的证书,就好像被权威机构盖过章,这样证书的有效性就能生成了。之所以说数字证书能证明证书持有者的身份,是因为:证书中包含了证书持有者信息和证书持有者公钥,通过权威机构(CA)的认证,数字证书就有了其有效性,就好比身份证被公安局盖了章之后,就能证明一个人的身份了。这样一来,A就无法伪造成C了。因为B要核实报文持有者的身份,只要将A发送过来的数字证书拿去CA查询,数字证书中的公钥已经和证书持有人绑定在一起了,一查询即可知道公钥到底是A的还是C的了。这个过程就好像A给B出示了一张身份证,B一看就知道对方到底是A还是C了。

使用AppGallery Connect平台调试证书

AppGallery Connect平台提供了调试证书,我们可以本地生成秘钥,在AppGallery Connect平台生成调试证书后方在应用工程的sign文件夹下,配置统一签名文件,将其他开发者使用的设备ID添加到调试Profile即可,下面介绍如何生成调试证书。

生成p12秘钥

DevEco Studio提供了生成p12秘钥的工具,在主菜单栏单击Build > Generate Key and CSR

3c678aa22a924c723aaef05cf5a640f9.jpeg生成秘钥配置:

b153c5eab2684ecd902a9d0382438fb9.jpeg

Key store file选择生成秘钥文件的路径及文件名,文件名以.p12结尾:

355e641306303b8975b48965bbfe47f9.jpeg

5f88bcfc0a614652c6631d8908e787a5.jpeg

下一步选择csr文件路径:

53e4f9dd737f866b167d2158619d9c56.jpeg完成后会得到:

  • qingkouwei.csr

  • qingkouwei.p12

  • material文件夹。

申请调试证书和调试profile

证书是为HarmonyOS应用/元服务配置签名信息的数字证书,可保障软件代码完整性和发布者身份真实性。证书格式为.cer,包含公钥、证书指纹等信息。申请调试证书参考文档:申请调试证书Profile格式为.p7b,包含HarmonyOS应用/元服务的包名、数字证书信息、HarmonyOS应用/元服务允许申请的证书权限列表,以及允许应用/元服务调试的设备列表(如果应用/元服务类型为Release类型,则设备列表为空)等内容。每个HarmonyOS应用/元服务包中均必须包含一个Profile文件。申请调试证书参考:https://developer.huawei.com/consumer/cn/doc/app/agc-help-add-debugprofile-0000001914423102

将下载的.p7b与cer文件考本到sign文件夹,在build-profile.json中配置签名信息即可:

0997d581b57946062b21cb8ad16b0f4e.jpeg

这里注意storePassword不是我们上面生成签名时的密码,怎么获取这个密码呢?我们可以通过项目工具-签名工具配置签名信息,这样会自动获取到storePassword,这也是签名提到material文件夹的作用。

这里要注意,生成签名时需要先在AppGallery Connect平台生成APPID:

906a53ad37ff90a5a2071c5bdcc0ff85.jpeg

此外还有一下几点注意点:

  1. 使用自动签名前,请确保本地系统时间与北京时间(UTC/GMT +8.00)保持一致。如果不一致,将导致签名失败。

  2. 每个账号最多可申请两个调试证书,自动签名占用名额调试证书额度,如果AppGallery Connect平台已经创建了两个调试证书,那么该账号后续自动签名会失败。

  3. 证书申请成功即为“生效”状态。若证书状态变为“失效”或“已吊销”,表示当前证书已不可用,且通过此证书申请的Profile也会全部失效或吊销。您需要重新申请证书与Profile。证书一旦废除将不可恢复,且通过此证书申请的Profile也会全部失效,请谨慎操作。

  4. 一个应用最多可申请100个Profile文件。

  5. 修改调试设备后,会生成新的调试Profile,请在生效后重新下载调试Profile

  6. 若Profile状态变为“失效”或“已吊销”,表示当前Profile已不可用,您需要重新申请Profile。

  7. 可以通过命令hdc shell bm get --udid命令获取手机的udid。

如果一个账号已经创建了两个调试证书,那么使用该账号自动签名会失败,报下面错误:

af069b9f8c667e09138127a0330e4345.jpeg

总结

本文介绍了HarmonyOS 的签名机制,以及开发过程中如何处理协作开发签名冲突管理问题。

作者:轻口味
链接:https://juejin.cn/post/7422621299912245289

关注我获取更多知识或者投稿

d264cbc0cd0ebe13031f5b098bde4d4b.jpeg

0a2ceec8eb54c60a1b7206db93f96fe9.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值