Skip to content

storeP12() 证书打包 ​

📦 把私钥和证书打包成 PKCS12(.p12) 格式写入指定路径。

📎 源码在线查看:script.js(storeP12)

签名 ​

javascript
function storeP12(pri, p7, p12Path, p12Password)
参数含义
pri私钥对象
p7证书对象(会被 cast 成 X509Certificate)
p12Path输出 p12 文件完整路径
p12Passwordp12 密码(固定 '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 做中间人代理时复用该客户端证书

相关文档 ​

基于 VitePress 构建 · 教学用途