当前位置: 首页 > news >正文

[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格式的文件。打开命令行或终端,并运行以下命令:

$ 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 文件时所使用的具体工具或命令。

相关文章:

  • 周末总结(2024/05/25)
  • spring cloud config server源码学习(一)
  • 用天工AI写文章,节约了8个人的成本
  • 前端Vue小兔鲜儿电商项目实战Day01
  • 7个靠谱的副业赚钱方法,宝妈,上班族,学生党可以做的兼职副业
  • Debug-011-ES6中的链判断运算符(?.)
  • 前端自动将 HTTP 请求升级为 HTTPS 请求
  • Vue3实战笔记(37)—粒子特效登录页面
  • React@16.x(11)ref
  • OrangePi AIpro (8T)使用体验,性能测试报告
  • 【前端学习笔记】HTML基础
  • 基于Django的图书管理系统
  • kafka防止消息丢失配置
  • 蓝桥杯—SysTick中断精准定时实现闪烁灯
  • Transformer模型的简单学习
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • CAP 一致性协议及应用解析
  • CSS居中完全指南——构建CSS居中决策树
  • HTTP请求重发
  • Iterator 和 for...of 循环
  • Java IO学习笔记一
  • Java比较器对数组,集合排序
  • vue-router 实现分析
  • 从PHP迁移至Golang - 基础篇
  • 猴子数据域名防封接口降低小说被封的风险
  • 深入浏览器事件循环的本质
  • 使用common-codec进行md5加密
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • ​比特币大跌的 2 个原因
  • ​马来语翻译中文去哪比较好?
  • ###项目技术发展史
  • #mysql 8.0 踩坑日记
  • #控制台大学课堂点名问题_课堂随机点名
  • $ git push -u origin master 推送到远程库出错
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (35)远程识别(又称无人机识别)(二)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (二)PySpark3:SparkSQL编程
  • (二)换源+apt-get基础配置+搜狗拼音
  • (分布式缓存)Redis持久化
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (十三)MipMap
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .Net Core 中间件验签
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • [20181219]script使用小技巧.txt
  • [Android]如何调试Native memory crash issue
  • [Angular] 笔记 7:模块
  • [Angular] 笔记 9:list/detail 页面以及@Output