[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 文件时所使用的具体工具或命令。
相关推荐
Fate_I_C11 小时前
Kotlin 为什么是 Android 开发的首选语言
android·开发语言·kotlin
黄林晴11 小时前
Android CLI 来了!终端一键建项目、控模拟器、给 Agent 喂官方规范
android
常利兵11 小时前
Kotlin 助力 Android 启动“大提速”
android·开发语言·kotlin
撩得Android一次心动11 小时前
Android DataBinding 全面解析【源码篇2】
android·源码·android jetpack·databinding
守月满空山雪照窗11 小时前
图形 API 体系解析:Android Vulkan / OpenGL 与主流图形 API 对比
android
我命由我1234511 小时前
Android 开发,getSystemService 警告信息:Must be one of: Context. POWER_SERVICE ...
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
zopple11 小时前
Laravel3.x经典特性回顾
android·java·数据库
Digitally11 小时前
8 种方法:将视频从手机传输到电脑(安卓 /iOS)
android·智能手机·电脑
LiuYaoheng12 小时前
【Android】Handler 全面解析
android