如下,我们有一个platform.pk8和platform.x509.pem。为了打包,需要将私钥(.pk8)和公钥证书(可能是.pem或.crt文件)合并成一个PKCS#12 格式的密钥库文件
1.准备你的私钥和证书文件
确保你有以下两个文件:
- 私钥文件(例如:
platform.pk8
) - 证书文件(例如:
platform.x509.pem
)
2.使用OpenSSL合并成PKCS#12 格式
你可以使用OpenSSL命令行工具来创建一个PKCS#12格式的文件。打开命令行或终端,并运行以下命令:
$ 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 格式。可以使用以下命令查看文件内容(仅查看前几行):
$ head /Users/gamin/Documents/call-sign/platform.pk8
或
$ 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 格式:
$ 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 文件不应加密。
转换后,确认是否转换完成:
$ cat /Users/gamin/Documents/call-sign/platform.pem
你应该看到以 -----BEGIN PRIVATE KEY-----
开始并以 -----END PRIVATE KEY-----
结束的文本。
(3).重新尝试创建 PKCS#12 文件
使用新生成的 PEM 格式私钥再次尝试创建 PKCS#12 文件
不指定别名时,默认别名为1.
$ openssl pkcs12 -export -in platform.x509.pem -inkey platform.pem -out platform.p12
也可以指定别名
$ 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
文件中使用的别名可能是默认的,例如 1
或 mykey
,这取决于你用来执行转换的工具和命令。
$ openssl pkcs12 -export -in platform.x509.pem -inkey platform.pem -out platform.p12 -name "desired-alias"
你将被提示输入一个密码来保护这个新的密钥库文件
(5).检查 PKCS#12 证书别名
使用 OpenSSL 检查
你可以使用 OpenSSL 来列出 .p12
文件中的条目,这将帮助你找到正确的别名:
$ openssl pkcs12 -info -in /Users/gamin/Documents/yunjuke/phone/call-sign/platform.p12 -nodes
这个命令会要求你输入密码(创建 .p12
文件时设置的密码),然后显示文件内容,包括证书和相关的密钥信息。别名通常会在输出中显示。
使用 keytool 检查别名
如果你安装了 Java Development Kit (JDK),你还可以使用 keytool
来查看文件中的别名:
$ keytool -list -keystore /Users/gamin/Documents/yunjuke/phone/call-sign/platform.p12 -storetype PKCS12
这也会要求你输入密钥库的密码,然后列出所有条目的别名和证书信息。
注意事项
- 确保在命令行中指定正确的文件路径和密码。
- 如果你从未指定过别名,工具可能会使用默认的别名,如
1
或mykey
,但这取决于创建.p12
文件时所使用的具体工具或命令。