storeP12() 证书打包
📦 把私钥和证书打包成 PKCS12(.p12) 格式写入指定路径。
📎 源码在线查看:
script.js(storeP12)
签名
javascript
function storeP12(pri, p7, p12Path, p12Password)| 参数 | 含义 |
|---|---|
pri | 私钥对象 |
p7 | 证书对象(会被 cast 成 X509Certificate) |
p12Path | 输出 p12 文件完整路径 |
p12Password | p12 密码(固定 'r0ysue') |
实现
javascript
function storeP12(pri, p7, p12Path, p12Password) {
var X509Certificate = Java.use("java.security.cert.X509Certificate")
var p7X509 = Java.cast(p7, X509Certificate);
var chain = Java.array("java.security.cert.X509Certificate", [p7X509])
var ks = Java.use("java.security.KeyStore").getInstance("PKCS12", "BC");
ks.load(null, null);
ks.setKeyEntry("client", pri, Java.use('java.lang.String').$new(p12Password).toCharArray(), chain);
try {
var out = Java.use("java.io.FileOutputStream").$new(p12Path);
ks.store(out, Java.use('java.lang.String').$new(p12Password).toCharArray())
} catch (exp) {
console.log(exp)
}
}步骤
关键点
- BC provider:
getInstance("PKCS12", "BC")用 BouncyCastle 创建 KeyStore,Android 自带 BC - 证书链:
Java.array构造单元素数组(这里只有一张证书,未包含完整链) - 密码:
Java.use('java.lang.String').$new(p12Password).toCharArray()把字符串转成 char[](KeyStore API 要求) - 异常吞掉:写文件失败只
console.log,不影响 App 正常运行
触发场景
服务器校验客户端(双向认证)时,App 用客户端证书做认证。storeP12 在 客户端证书导出 hook 里被调用,把 App 内的私钥+证书导出成 p12。
导出后的使用
- 路径:
/sdcard/Download/<包名><随机串>.p12 - 密码:
r0ysue - 用 keystore-explorer 打开查看
- 或导入到 Burp/mitmproxy 做中间人代理时复用该客户端证书