[Android]将私钥(.pk8)和公钥证书(.pem/.crt)合并成一个PKCS#12格式的密钥库文件

如下,我们有一个platform.pk8和platform.x509.pem。为了打包,需要将私钥(.pk8)和公钥证书(可能是.pem或.crt文件)合并成一个PKCS#12格式的密钥库文件

1.准备你的私钥和证书文件

确保你有以下两个文件:

  • 私钥文件(例如:platform.pk8
  • 证书文件(例如:platform.x509.pem

2.使用OpenSSL合并成PKCS#12格式

你可以使用OpenSSL命令行工具来创建一个PKCS#12格式的文件。打开命令行或终端,并运行以下命令:

bash 复制代码
$ openssl pkcs12 -export -in platform.x509.pem -inkey platform.pk8 -out platform.p12

这个命令做了什么:

  • -in platform.x509.pem: 这部分指定了证书文件。platform.x509.pem 需要替换为你的证书文件的实际路径。如果该文件位于当前目录下,可以直接使用文件名;如果不是,你需要提供完整的文件路径,例如 /path/to/your/platform.x509.pem

  • -inkey platform.pk8: 这部分指定了私钥文件。platform.pk8 需要替换为你的私钥文件的实际路径。同样,如果文件在当前目录下,直接使用文件名即可;如果在其他位置,需要提供完整的路径,例如 /path/to/your/platform.pk8

  • -out platform.p12: 这部分指定了输出文件的名称和位置。platform.p12 是输出文件的名字,你可以指定一个特定的路径来保存这个文件,例如 /path/to/your/platform.p12

你将被提示输入一个密码来保护这个新的密钥库文件,记得这个密码因为你在Android的签名配置中会需要它。

创建PKCS#12文件报错

$ openssl pkcs12 -export -in /Users/gamin/Documents/yunjuke/phone/call-sign/platform.x509.pem -inkey /Users/gamin/Documents/yunjuke/phone/call-sign/platform.pk8 -out /Users/gamin/Documents/yunjuke/phone/call-sign/platform.p12

unable to load private key

8363834048:error:09FFF06C:PEM routines:CRYPTO_internal:no start line:/AppleInternal/Library/BuildRoots/ce725a5f-c761-11ee-a4ec-b6ef2fd8d87b/Library/Caches/com.apple.xbs/Sources/libressl/libressl-3.3/crypto/pem/pem_lib.c:694:Expecting: ANY PRIVATE KEY

该错误信息 unable to load private key 以及 Expecting: ANY PRIVATE KEY 表明 OpenSSL 无法正确识别或解析提供的私钥文件(platform.pk8)。这通常发生在私钥格式与 OpenSSL 预期的格式不匹配时。

对于 Android 应用签名,通常使用的私钥格式为 PKCS#8 (.pk8),但是必须确保它是以 PEM 格式存储的。如果你的 .pk8 文件不是 PEM 格式的,你可能需要将其转换为 OpenSSL 可以识别的 PEM 格式。

转换私钥到 PEM 格式

(1).确定当前私钥格式

首先,你需要确认你的私钥是否已经是 PEM 格式。可以使用以下命令查看文件内容(仅查看前几行):

bash 复制代码
$ head /Users/gamin/Documents/call-sign/platform.pk8

bash 复制代码
$ cat /Users/gamin/Documents/call-sign/platform.pk8

如果看到 -----BEGIN PRIVATE KEY----------END PRIVATE KEY----- 包围的文本,那么它是 PEM 格式的。如果没有,你需要执行转换。

如果输出以二进制形式显示,或者没有明显的 PEM 格式头(比如 -----BEGIN PRIVATE KEY-----),则表示可能是 DER 格式或其他格式。

下面这种是以二进制形式(DER 格式)存储的,而不是文本形式的 PEM 格式,看起来像乱码。因此,你需要将这个 DER 格式的私钥文件转换为 PEM 格式,以便 OpenSSL 能够正确处理。

(2).转换私钥到 PEM 格式

如果私钥是 DER 格式,你应该使用以下命令将其转换为 PEM 格式:

bash 复制代码
$ openssl pkcs8 -inform DER -outform PEM -in /Users/gamin/Documents/call-sign/platform.pk8 -out /Users/gamin/Documents/call-sign/platform.pem -nocrypt
  • -inform DER 表示输入文件是 DER 格式(二进制格式)。
  • -outform PEM 表示输出为 PEM 格式。
  • -in 指定输入文件的路径。
  • -out 指定输出文件的路径。
  • -nocrypt 表示输出的 PEM 文件不应加密。

转换后,确认是否转换完成:

bash 复制代码
$ cat /Users/gamin/Documents/call-sign/platform.pem

你应该看到以 -----BEGIN PRIVATE KEY----- 开始并以 -----END PRIVATE KEY----- 结束的文本。

(3).重新尝试创建 PKCS#12 文件

使用新生成的 PEM 格式私钥再次尝试创建 PKCS#12 文件

不指定别名时,默认别名为1.

bash 复制代码
$ openssl pkcs12 -export -in platform.x509.pem -inkey platform.pem -out platform.p12

也可以指定别名

bash 复制代码
$ openssl pkcs12 -export -in platform.x509.pem -inkey platform.pem -out platform.p12 -name "desired-alias"

你将被提示输入一个密码来保护这个新的密钥库文件

示例:

$ openssl pkcs12 -export -in /Users/gamin/Documents/call-sign/platform.x509.pem -inkey /Users/gamin/Documents/call-sign/platform.pem -out /Users/gamin/Documents/call-sign/platform.p12

(4).PKCS#12 文件的别名和密码

在从 .pk8 和相关证书文件转换为 .p12(PKCS#12)格式的过程中,别名这个概念可能会有所变化,具体取决于你如何进行转换。.pk8 文件通常是一个私钥文件,它本身并没有包含别名信息,别名通常是与证书库(如 Java 的 keystore)一起使用时才有的概念。

当你将 .pk8 和对应的证书文件转换为 .p12 文件时,你可以指定一个别名,但这并不是自动的。如果在转换过程中没有显式指定别名,那么在生成的 .p12 文件中使用的别名可能是默认的,例如 1mykey,这取决于你用来执行转换的工具和命令。

bash 复制代码
$ openssl pkcs12 -export -in platform.x509.pem -inkey platform.pem -out platform.p12 -name "desired-alias"

你将被提示输入一个密码来保护这个新的密钥库文件

(5).检查PKCS#12证书别名
使用 OpenSSL 检查

你可以使用 OpenSSL 来列出 .p12 文件中的条目,这将帮助你找到正确的别名:

bash 复制代码
$ openssl pkcs12 -info -in /Users/gamin/Documents/yunjuke/phone/call-sign/platform.p12 -nodes

这个命令会要求你输入密码(创建 .p12 文件时设置的密码),然后显示文件内容,包括证书和相关的密钥信息。别名通常会在输出中显示。

使用 keytool 检查别名

如果你安装了 Java Development Kit (JDK),你还可以使用 keytool 来查看文件中的别名:

bash 复制代码
$ keytool -list -keystore /Users/gamin/Documents/yunjuke/phone/call-sign/platform.p12 -storetype PKCS12

这也会要求你输入密钥库的密码,然后列出所有条目的别名和证书信息。

注意事项
  • 确保在命令行中指定正确的文件路径和密码。
  • 如果你从未指定过别名,工具可能会使用默认的别名,如 1mykey,但这取决于创建 .p12 文件时所使用的具体工具或命令。
相关推荐
网络研究院1 小时前
Android 安卓内存安全漏洞数量大幅下降的原因
android·安全·编程·安卓·内存·漏洞·技术
凉亭下1 小时前
android navigation 用法详细使用
android
小比卡丘4 小时前
C语言进阶版第17课—自定义类型:联合和枚举
android·java·c语言
前行的小黑炭5 小时前
一篇搞定Android 实现扫码支付:如何对接海外的第三方支付;项目中的真实经验分享;如何高效对接,高效开发
android
落落落sss6 小时前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
代码敲上天.7 小时前
数据库语句优化
android·数据库·adb
GEEKVIP9 小时前
手机使用技巧:8 个 Android 锁屏移除工具 [解锁 Android]
android·macos·ios·智能手机·电脑·手机·iphone
model200511 小时前
android + tflite 分类APP开发-2
android·分类·tflite
彭于晏68911 小时前
Android广播
android·java·开发语言
与衫12 小时前
掌握嵌套子查询:复杂 SQL 中 * 列的准确表列关系
android·javascript·sql