起因

第一次给应用配签名,我以为点一下"自动生成"就完事了。

配完打开构建配置一看,多出一堆文件:四个后缀各不相同的证书类文件,还有一个目录。而配置文件里只引用了其中三个。

这篇文章把这套东西拆开讲清楚:哪个文件是干什么的,为什么生成了四个却只用三个,以及配签名时最容易卡住的地方。

一、先看结果:四个文件,一个目录

打开自动生成签名后,产物会落在用户目录下的 .ohos\config 里。我这边看到的是:

.ohos\config\
  ├── default_MyApplication_....cer    证书
  ├── default_MyApplication_....csr    证书请求
  ├── default_MyApplication_....p12    密钥库
  ├── default_MyApplication_....p7b    Profile
  └── material\                        素材目录

四个文件,后缀都不重复。名字里那串长字符是自动生成的唯一标识,同一个账号下不同工程的标识不同,所以你的文件名和我的不会一样。

注意这个差异:工程名带在文件名里。 也就是说,如果你改了工程名或者换了包名,之前生成的这批文件不会跟着改名,需要重新生成。

二、四个文件分别是干什么的

按签名链路的顺序说,这样容易记住。

.p12 是密钥库。 里面装着你的私钥,这是整个签名体系的根。构建时会用它来对安装包做签名。

.csr 是证书请求。 它是用私钥生成的一段请求信息,用途是"向证书颁发机构申请一张证书"。这个文件只在申请证书那一步用一次,申请完就没有后续用途了。

.cer 是证书。 它证明"这个公钥确实属于这个开发者",由申请流程签发生成。构建时会把它一起打进安装包。

.p7b 是 Profile。 它把证书、包名、授权能力这几样东西绑在一起。安装包最终能不能被设备接受,很大程度看这个文件。它也是唯一一个和"具体哪个应用"绑定的文件,另外三个是开发者身份层面的东西。

三、构建配置只引用三个

打开 build-profile.json5,看 signingConfigs 那一段,实际引用的是这些:

certpath     指向 .cer
storeFile    指向 .p12
profile      指向 .p7b
keyAlias     debugKey
signAlg      SHA256withECDSA
keyPassword  一串密文
storePassword 一串密文

三个文件路径,都在这里。.csr 不在。

这不是遗漏,是设计。.csr 的任务在申请证书那一刻就完成了,构建阶段不需要它。

所以如果你在某份教程里看到有人让你手动指定 .csr 路径,那大概是搞混了流程。

四、密码字段存的不是你的密码

这是我当时最困惑的一处。

build-profile.json5 里的 storePassword 和 keyPassword,值是两串很长的十六进制字符串。它不是明文密码,也不是你自己填的那个密码。

自动生成签名时,DevEco 会自己生成一对密码并加密存储,你从头到尾都不需要知道它们是什么。所以你也不必去"记住密码"。

但这件事有个副作用:你不能直接改配置文件来换密码。 想换,得重新走一次签名配置,让它重新生成。

如果你的团队需要把签名配置共享给其他人或 CI,正确的做法不是拷这两个字段,而是用环境变量或者专门的凭据管理,把那串密文当机密对待。

五、配签名最容易卡住的地方

我第一次配的时候,报错是这样的:

缺少设备导致无法新建 profile 文件,请先通过 IP 或 USB 连接设备。

原因:自动生成 Profile 需要一个已经连接中的设备。 没有设备,它不知道你的应用要装到哪种设备上,也无法确定设备类型,于是建不了 Profile。

解法是把顺序反过来:先启动模拟器或连上真机,等设备就绪,再回来配签名。

判断设备有没有连上,可以用 SDK 工具链里的 hdc(在 sdk/default/openharmony/toolchains/ 目录下):

hdc list targets

返回一个地址(形如 127.0.0.1:5555)就说明已经连上;返回空就是还没有设备。

顺带说,那个报错对话框自己还给了一条退路:

如果是在模拟器上安装 HAP 包,可以跳过签名这一步骤。

也就是说纯本地调试场景下,签名不是硬门槛。但要往真机装、要打包分发,就必须配。

六、一个容易漏的建工程选项

配好签名之后如果还报设备类型相关的错,回头看去建工程那一步。

新建工程时有个「设备类型」勾选组,默认只勾了 Phone。

如果你的目标设备是平板、折叠屏、2in1 或车机,这里必须补勾。 设备类型会写进模块配置,没勾的类型在安装时可能被拦下来。

这一步在建工程时就该做完。 等项目都写完了再回头改,虽然能改,但会多绕一圈。

七、换机器之后怎么办

签名产物默认放在用户目录下,不在工程里。这带来一个后果:

把工程拷到另一台机器,签名配置会失效,因为那台机器上没有对应的证书文件。

正确做法是团队共用一份签名配置,或者每台机器各自生成一份。不要直接把整个 .ohos 目录提交到代码仓库,那里面有私钥。

如果确实需要用固定签名(比如分发测试包),就把那几个文件放在团队约定的位置,通过环境变量引用,而不是写死在 build-profile.json5 的绝对路径里。

几处和常见理解不一样的地方

  • 自动签名会生成四个文件:.cer 证书、.csr 证书请求、.p12 密钥库、.p7b Profile
  • 构建配置只引用三个,.csr 不参与构建,它只在申请证书时用一次
  • 配置里的密码字段不是明文,是自动生成的加密串,你不需要知道内容,也改不了
  • 配签名要先有设备,否则报「缺少设备导致无法新建 profile 文件」
  • 新建工程时设备类型默认只勾 Phone,目标设备是平板或折叠屏要补勾
  • 签名产物在用户目录不在工程里,换机器会失效,别把 .ohos 提交到仓库

配签名之前,先做两件事:启动一台设备并确认 hdc list targets 能看到它,以及检查工程的设备类型是否勾全。这两件事做好,剩下的就是点一个勾选框。


补充说明:本篇没有配图。所有结论来自本机的实际配置过程与生成后的文件核对;涉及路径与文件名的部分以本机实测为准。不同工程、不同账号下生成的文件名会不一样,这一点在文中已说明。运行期差异可能随版本变化,遇到不一致时以本机实测为准。


本系列其他文章

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐