1. 程式人生 > 程式設計 >Android簽名檔案轉化為pk8和pem的實現

Android簽名檔案轉化為pk8和pem的實現

Android簽名工具

常用的android的簽名工具有:jarsigner 和apksigner。jarsigner使用keystore檔案,apksigner使用pk8+x509.pem。

什麼是.pem和.pk8檔案

.pem

在android對apk簽名的時候,.pem這種檔案就是一個X.509的數字證書,裡面有使用者的公鑰等資訊,是用來解密的。檔案格式裡面不僅可以儲存數字證書,還能存各種key。

.pk8

以.pk8為副檔名的檔案,應該和PKCS #8是對應的,用來儲存private key。

keystore檔案轉化為pk8+pem

1.將keystore檔案轉換為pkcs12格式

keytool -importkeystore -srckeystore my.keystore -destkeystore tmp.p12 -srcstoretype JKS -deststoretype PKCS12

2. 將PKCS12 dump成pem

openssl pkcs12 -in tmp.p12 -nodes -out tmp.rsa.pem

tmp.rsa.pem 是文字格式可以直接檢視。

開啟文字可以看到私鑰(PRIVATE KEY )和證書(CERTIFICATE);

複製“BEGIN CERTIFICATE” “END CERTIFICATE” 到(新建個檔案) cert.x509.pem

複製 “BEGIN RSA PRIVATE KEY” “END RSA PRIVATE KEY” 到(同上) private.rsa.pem

cert.x509.pem 檔案即是我們最後需要的證書檔案

3.生成pk8格式的私鑰

openssl pkcs8 -topk8 -outform DER -in private.rsa.pem -inform PEM -out private.pk8 -nocrypt
cert.x509.pem private.pk8

即是我們最後需要的檔案。

*備註:
-nocrypt 這個引數設定key加密 如果設定了這個引數 下面簽名 只要證書+key 不需要密碼了 如果加密 應該
openssl pkcs8 -topk8 -outform
DER -in private.rsa.pem -inform PEM -out private.pk8 接下來輸入密碼*

4.用法

java -jar signapk.jar cert.x509.pem private.pk8 unsigned.apk signed.apk

jarsigner 的用法

jarsigner -verbose -keystore android.keystore -signedjar android_signed.apk android.apk android.keystore

使用這種方式會報錯:找不到 的證書鏈。×× 必須引用包含專用金鑰和相應的公共金鑰證書鏈的有效金鑰庫金鑰條目。

jarsigner -verbose -keystore DT.jks -signedjar signed.apk unsigned.apk "別名"

補充知識:Android 建立自己的pk8,x509.pem並給app簽名

1,生成key

命令: keytool -genkey -v -keystore app.keystore -alias gundam_wing -keyalg RSA -validity 20000
控制檯輸出:
輸入金鑰庫口令:
再次輸入新口令:
您的名字與姓氏是什麼?
[Unknown]: TechStone
您的組織單位名稱是什麼?
[Unknown]: Gundam
您的組織名稱是什麼?
[Unknown]: Gundam
您所在的城市或區域名稱是什麼?
[Unknown]: Shanghai
您所在的省/市/自治區名稱是什麼?
[Unknown]: Shanghai
該單位的雙字母國家/地區程式碼是什麼?
[Unknown]: zh
CN=TechStone,OU=Gundam,O=Gundam,L=Shanghai,ST=Shanghai,C=zh是否正確?
[否]: Y

正在為以下物件生成 2,048 位RSA金鑰對和自簽名證書 (SHA256withRSA) (有效期為 20,000 天):
CN=TechStone,C=zh
輸入 <gundam_wing> 的金鑰口令
(如果和金鑰庫口令相同,按回車):
[正在儲存app.keystore]

這個命令會生成帶組織/個人資訊的key,並存放在app.keystore檔案中

2,轉換key的格式

命令:

keytool -importkeystore -srckeystore app.keystore -destkeystore tmp.p12 -srcstoretype JKS -deststoretype PKCS12

控制檯會提示輸出tmp.p12的密碼以及app.keystore的密碼,輸入正確之後將會生成tmp.p12檔案。

3,將PKCS12格式的key dump為可直接閱讀的文字

命令:

openssl pkcs12 -in tmp.p12 -nodes -out tmp.rsa.pem

dump過程中也會提示輸入密碼,正確輸入之後可閱讀的token會儲存在tmp.rsa.pem中

4,提取

用文字編輯器開啟tmp.rsa.pem,將從
-----BEGIN PRIVATE KEY-----

-----END PRIVATE KEY-----

這一段(包含這兩個tag)的文字複製出來,新建為檔案my_private.rsa.pem

將從
-----BEGIN CERTIFICATE-----

-----END CERTIFICATE-----


這一段(包含這兩個tag)的文字複製出來,新建為檔案my.x509.pem (簽名時用到的公鑰)

5,轉換,生成pk8格式的私鑰

openssl pkcs8 -topk8 -outform DER -in my_private.rsa.pem -inform PEM -out my_private.pk8 -nocrypt

這個生成的my_private.pk8就是簽名時用到的私鑰

6,對apk簽名

java -jar signapk.jar my.x509.pem my_private.pk8 my.apk my_signed.apk

以上這篇Android簽名檔案轉化為pk8和pem的實現就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。