背景介绍
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:
生成秘钥配置:
Key store file选择生成秘钥文件的路径及文件名,文件名以.p12
结尾:
下一步选择csr文件路径:
完成后会得到:
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中配置签名信息即可:
这里注意storePassword不是我们上面生成签名时的密码,怎么获取这个密码呢?我们可以通过项目工具-签名工具配置签名信息,这样会自动获取到storePassword,这也是签名提到material文件夹的作用。
这里要注意,生成签名时需要先在AppGallery Connect平台生成APPID:
此外还有一下几点注意点:
使用自动签名前,请确保本地系统时间与北京时间(UTC/GMT +8.00)保持一致。如果不一致,将导致签名失败。
每个账号最多可申请两个调试证书,自动签名占用名额调试证书额度,如果AppGallery Connect平台已经创建了两个调试证书,那么该账号后续自动签名会失败。
证书申请成功即为“生效”状态。若证书状态变为“失效”或“已吊销”,表示当前证书已不可用,且通过此证书申请的Profile也会全部失效或吊销。您需要重新申请证书与Profile。证书一旦废除将不可恢复,且通过此证书申请的Profile也会全部失效,请谨慎操作。
一个应用最多可申请100个Profile文件。
修改调试设备后,会生成新的调试Profile,请在生效后重新下载调试Profile
若Profile状态变为“失效”或“已吊销”,表示当前Profile已不可用,您需要重新申请Profile。
可以通过命令
hdc shell bm get --udid命令
获取手机的udid。
如果一个账号已经创建了两个调试证书,那么使用该账号自动签名会失败,报下面错误:
总结
本文介绍了HarmonyOS 的签名机制,以及开发过程中如何处理协作开发签名冲突管理问题。
作者:轻口味
链接:https://juejin.cn/post/7422621299912245289
关注我获取更多知识或者投稿