Skip to content

证书与签名

查看证书信息:

keytool -list -v -keystore debug.keystore 查看公钥的签名算法信息:openssl x509 -in certificate.pem -text -noout

提取公钥

keytool -exportcert -alias your_alias -keystore your_keystore.keystore -rfc -file certificate.cer

查看应用签名:

keytool -printcert -file META-INF/CERT.RSA或者keytool -printcert -jarfile <APK文件路径>
用法:
keytool -printcert -jarfile xxxx.apk | grep "SHA256:" | awk '{print $NF}' | tr -d ':'| xxd -r -p | base64

TIP

  • keytool -printcert -jarfile xxxx.apk:列出签名详细信息,包括SHA256指纹。
  • grep "SHA256:":筛选出包含“SHA256”的行,也就是SHA256指纹那一行。
  • awk '{print $NF}':取出最后一列(即指纹部分)。
  • tr -d ':':删除所有冒号。
  • xxd -r -p | base64:将无冒号的十六进制指纹转换为二进制,再转换为Base64编码,这样得到的结果可以方便地用于AndroidManifest.xml或其他需要Base64编码的指纹的地方,不添加就是无冒号的SHA256值。

创建证书

使用命令行生成 Android 签名证书,可以使用 keytool 工具。以下是生成 PKCS12 格式、扩展名为 jks、有效期为 50 年的签名证书的命令:
keytool -genkeypair -alias my_alias -keyalg RSA -keysize 2048 -validity 3650 -storetype PKCS12 -keystore abc.jks -storepass my_store_password -keypass my_key_password
该命令将生成一个名为 abc.jks 的密钥库文件。密钥库文件将包含一个名为 my_alias 的密钥。密钥的有效期为 10 年。 命令参数说明如下:

TIP

  • genkeypair:生成一个包含公钥和私钥的密钥对。
  • alias:定义别名,用于标识此证书在 keystore 中的位置。你可以选择自己喜欢的别名,但推荐使用字母和数字组合。
  • keyalg:密钥的加密算法。
  • keysize:密钥的长度。
  • validity:密钥的有效期,以天为单位。
  • storetype:密钥库的类型。
  • keystore:密钥库文件的名称,.keystore或者.jks。
  • storepass:密钥库的密码。
  • keypass:密钥的密码。

在执行该命令时,需要输入以下信息:

INFO

  • 国家代码:输入两字母的国家/地区代码。
  • 姓名和组织:这将出现在证书中作为发行者的信息,可自由填写。
  • 公司或组织名称:你的公司或组织名称。
  • 组织单位:可选的公司部门或组织单元名称。
  • 地址和城市:同样用于描述发行者信息。

生成密钥库文件后,可以使用 keytool 工具导出证书:
keytool -export -alias my_key_alias -storetype PKCS12 -keystore my_keystore.jks -file my_certificate.cer
该命令将生成一个名为 my_certificate.cer 的证书文件。证书文件可以用于签名 Android 应用。

重新签名

./apksigner sign --ks ./platform.jks --ks-key-alias alias名字 --out ./out.apk in.apk

AOSP证书签名

java -Djava.library.path=. -jar signapk.jar xxx.x509.pem xxx.pk8 input.apk output.apk
常见错误:
"no conscrypt_openjdk_jni-linux-x86_64 in java.library.path"错误解决方法:libconscrypt_openjdk_jni.so文件放到目录下,并添加-Djava.library.path=.

下载signapk.jar

格式转换

platform.x509.pem、platform.pk8这两个证书转为platform.jks或platform.keystore格式文件。

sh
# 1、使用 OpenSSL 将 .pem 和 .pk8 合并为 PKCS12 格式 (.p12 或 .pkcs12)
openssl pkcs12 -export -in platform.x509.pem -inkey platform.pk8 -out platform.p12 -name "platform_key" -password pass:your_password_here

# 2、 使用 keytool 将 PKCS12 文件转换为 JKS 或 Keystore 文件
keytool -importkeystore -srckeystore platform.p12 -srcstoretype PKCS12 -destkeystore platform.jks -deststoretype JKS -srcstorepass your_password_here -deststorepass new_keystore_password_here

openssl 命令说明:

INFO

  • -in: 指定X.509证书文件。
  • -inkey: 指定私钥文件。
  • -out: 指定输出的PKCS12文件名。
  • -name: 给证书和私钥对指定一个别名。
  • -password: 设置PKCS12文件的密码。

keytool 命令说明:

INFO

  • -srckeystore: 源PKCS12文件路径。
  • -srcstoretype: 源文件类型,这里是PKCS12。
  • -destkeystore: 目标JKS文件路径。
  • -deststoretype: 目标文件类型,这里是JKS。
  • -srcstorepass: 源文件密码,即你在第一步设置的密码。
  • -deststorepass: 目标JKS文件的密码。

错误处理
1、Could not read private key from -inkey file from ./platform.pk8错误: 先执行openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.1.pem导出platform.1.pem文件,讲-inkey 的参数替换为platform.1.pem在执行openssl命令生成p12文件。