鸿蒙电脑开发命令行-签名篇与本机hdc shell

鸿蒙电脑命令行

鸿蒙电脑提供了终端工具,我们在前面编译C/C++中就使用到了终端,终端中自带了一些命令行,但是不能满足我们使用,很多开发常用的命令工具都需要通过其他来源搞定,我们主要使用DevBox补充命令,我们先看看这两个工具提供的命令如何查看

系统自带的终端

打开系统的终端,在右上角点击?进入用户手册,可以查看命令,不太好的是,无法直接搜索
在这里插入图片描述

DevBox包含的命令

DevBox包含的命令比较多,常见的基础编译开发工具相对较全,也支持命令搜索,但是这些命令仍需要在系统的终端中使用
在这里插入图片描述

签名

知道了如何使用命令,我们来看下如何针对二进制进行签名

签名工具binart-sign-tool

官方指导中,我们可以看到Binary Sign Tool (二进制签名工具),是用于在OpenHarmony PC/2in1设备上对二进制文件进行代码签名的工具,支持通过命令行的方式对标准ELF文件进行代码签名或打印已签名ELF的证书信息。在研究后官方文档后,关键点在-selfSign这个参数,支持自签名和证书签名两种行为,我们这里讲下两种签名方式的使用
在这里插入图片描述

工具获取

首先是工具获取

Linux/Mac/Windows等交叉编译环境

在非鸿蒙电脑上,需要通过OpenHarmony构建流水线获取

cd ~
wget https://cidownload.openharmony.cn/version/Master_Version/ohos-sdk-full_ohos/20250819_020817/version-Master_Version-ohos-sdk-full_ohos-20250819_020817-ohos-sdk-full_ohos.tar.gz
tar -zvxf version-Master_Version-ohos-sdk-full_ohos-20250819_020817-ohos-sdk-full_ohos.tar.gz

cd ~/ohos-sdk/linux
unzip native-linux-x64-6.0.0.46-Beta1.zip
unzip toolchains-linux-x64-6.0.0.46-Beta1.zip

其中native-linux-x64-6.0.0.46-Beta1.zip解压所在的父目录的全路径为 后续所需要的sdk路径,如:/home/ohos-sdk/linux
工具均在toolchains/lib/binary-sign-tooltoolchains/hdc 等路径,大家find一下就好,记得指定环境变量。

鸿蒙电脑

在鸿蒙电脑上比较简单,直接升级到对应系统版本后,直接安装应用即可

自签名
binary-sign-tool sign -inFile "unsigned.elf" -outFile "signed.elf" -selfSign "1"

假定我们编译好了一个在鸿蒙上的可执行文件(ELF),我们可以通过这个方式进行签名,以我们常说的tree命令举例,编译好的二进制进行自签名如下

binary-sign-tool sign -inFile tree -outFile tree -selfSign "1"

这样生成的二进制就可以在鸿蒙设备上运行了,这个二进制可以放到任意鸿蒙电脑上,在终端中./tree执行即可
如下面这个签名后的文件,通过华为分享到鸿蒙电脑中
在这里插入图片描述
在增加了可执行权限后,即可执行二进制(首次执行需要弹窗允许,后续不需要)

chmod +x binname
./binname

在这里插入图片描述
在这里插入图片描述
以上签名动作无论在哪个平台上进行的,都可以直接运行,这样对于使用来说就相对方便了一些。

证书签名

针对证书签名,我的理解是在需要特定权限时,自签名无法解决,需要通过证书签名(申请二进制证书流程)以下是我进行操作尝试的流程(以鸿蒙电脑举例,都是一样的)

准备好证书请求文件

按照官方指导,需要准备证书请求文件,但是只讲了在DevEco中生成,如果没有安装DevEco则比较麻烦,因此,我们参考流水线的KeyTool流程通过命令的方式生成请求文件

生成.p12密钥库文件
keytool -genkeypair -alias "gdbkey" -keyalg EC -sigalg SHA256withECDSA -dname "C=CN,O=HUAWEI,OU=HUAWEI IDE,CN=gdbkey" -keystore gdbkey.p12 -storetype pkcs12 -validity 9125 -storepass 1qaz2wsx -keypass 1qaz2wsx

参数含义如下

   "-genkeypair": "生成密钥对,包括公钥和私钥,并将其存储到密钥库中",
   "-alias": "指定密钥对的别名,用于标识密钥库中的密钥条目",
   "-keyalg": "指定密钥算法,如EC(椭圆曲线算法)",
   "-sigalg": "指定签名算法,如SHA256withECDSA",
   "-dname": "指定证书主题信息(Distinguished Name),包含国家、组织等信息",
   "-keystore": "指定密钥库文件名,用于存储密钥和证书",
   "-storetype": "指定密钥库类型,如PKCS12",
   "-validity": "指定证书有效期(天数),如9125天",
   "-storepass": "指定密钥库密码,用于保护密钥库的完整性",
   "-keypass": "指定密钥密码,用于保护私钥"

我们关注以下部分

  • “-genkeypair”: “生成密钥对”,
  • “-alias”: “密钥别名”, 我们决定 gdbkey
  • “-keyalg”: “密钥算法”,
  • “-sigalg”: “签名算法”,
  • “-dname”: “证书主题信息”, 我们决定最后一段 CN=gdbkey
  • “-keystore”: “密钥库文件名”, 我们决定 gdbkey.p12
  • “-storetype”: “密钥库类型”,
  • “-validity”: “有效期(天)”,
  • “-storepass”: “密钥库密码”, 我们决定(切记) 密钥xxxxxxxx
  • “-keypass”: “密钥密码” 我们决定(切记) 密钥xxxxxxxx

结果如下:我们生成了一个名为gdbkey.p12的密钥库文件
在这里插入图片描述

解释下keytool命令,keytool 是 Java 开发工具包(JDK)自带的命令行工具,用于管理密钥库、数字证书和公钥/私钥对,因此这里需要安装JDK
在这里插入图片描述

生成.csr证书签名请求文件

同样的使用keytool命令生成请求文件

keytool -certreq -alias "gdbkey" -keystore gdbkey.p12 -storetype pkcs12 -file gdbkey.csr

生成请求文件参数比较简单

  • “-certreq”: “生成证书签名请求(CSR)”,
  • “-alias”: “密钥别名”,
  • “-keystore”: “密钥库文件名”,
  • “-storetype”: “密钥库类型”,
  • “-file”: “输出CSR文件名”
    这里按照前面创建.p12文件给的参数即可,注意要输入生成.p12是注册的密钥
    在这里插入图片描述

注意:.p12.csr文件千万别丢

申请证书

目前证书受限开放,可以通过官网中工单申请体验

在这里插入图片描述
后续按照官方指导即可
这是申请好的证书,点击下载就行了
在这里插入图片描述

证书签名

下载好的.cer证书放到同一级目录中后,即可进行二进制签名
在这里插入图片描述
如同DevEco打包应用一样,签名使用的profile是一个json文件,我们使用以下module.json,存放一个DEBUGGER权限,签名给gdb用于调试

{
    "requestPermissions": [
        {
                "name": "ohos.permission.kernel.DEBUGGER"
        }
    ],
    "debug-info" : {
        "device-id-type": "udid",
        "device-ids": [
                ""
        ]
    }
}

这里证书签名时,只能通过debug的方式(正式的应该只有企业等拥有,我只有调试权限),因此要查看我的设备的udid进行绑定

获取udid
  • 如果是在非鸿蒙电脑上操作,按照官方指导部署好hdc工具;
  • 如果是鸿蒙电脑,安转好DevBox
  • 然后按照以下操作打开开发者模式和调试模式
  1. 进入设备设置
  2. 进入关于本机
  3. 多次点击版本号
  4. 打开开发者模式
  5. 进入系统设置
  6. 找到并打开开发人员选项
  7. 启用USB调试
非鸿蒙电脑

执行hdc shell bm get --udid 直接获取

鸿蒙电脑(hdc shell 使用方式)
  1. 打开无线调试,记住无线调试中的端口号,下图中的42251位置
    在这里插入图片描述
  2. 链接无线调试并通过hdc shell 获取udid(当然,这样也可以直接使用hdc shell,像在windwos上用hdc shell 一样)
hdc tconn 127.0.0.1:<port> #本机链接

在这里插入图片描述

补充profile信息

将获取到的udid填入device-ids字段中,保存

{
    "requestPermissions": [
        {
                "name": "ohos.permission.kernel.DEBUGGER"
        }
    ],
    "debug-info" : {
        "device-id-type": "udid",
        "device-ids": [
                "5BXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX6E03290"
        ]
    }
}
对二进制进行签名

把准备好的二进制放到证书、profile同目录下,我们这里以我们本地编译好的gdb为例,
在这里插入图片描述

指定cer、p12、keyPwd、keystorePwd、输入文件和输出文件(ELF),然后执行以下命令即可签名

binary-sign-tool sign -keyAlias "gdbkey" -signAlg "SHA256withECDSA" -appCertFile "gdbkey.cer" -inFile "gdb" -keystoreFile "gdbkey.p12" -outFile "gdb" -keyPwd "1qaz2wsx" -keystorePwd "1qaz2wsx" -moduleFile "module.json"

在这里插入图片描述
然后我们增加执行权限chmod +x gdb,我们验证下功能,用clang编译一个helloworld,很简单相信大家都会做
在这里插入图片描述

使用签名后的gdb,./gdb helloworld,确定运行

在这里插入图片描述此时可以看到,通过证书签名的方式,gdb也可以运行成功在这里插入图片描述

这次我们讲了两种二进制签名方式,同时也说明了在鸿蒙电脑上如何使用hdc命令,相信随着环境逐步完善,会有更多的场景可以使用

附录

应用及环境相关工具开源应用
GitNext
BiShengJDKInstaller
bishengjdk-8
bishengjdk-17
DevPython-OH
DevBox
DevNode-OH

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐