署名認証に関する知識
7279 ワード
コマンド:
keystoneの生成(証明書と秘密鍵のセットを格納する場所)
keytool-genkey-alias(別名)hello-keyalg RSA-validity 20000-keystore hello.keystore
keystore情報の表示
keytool -list -v -keystore hello.keystore -storepass 123456
デフォルトでは、-listコマンドは証明書のMD 5フィンガープリントを印刷します.一方、-vオプションを指定すると、証明書は読み取り可能な形式で印刷され、-rfcオプションを指定すると、証明書は印刷可能な符号化形式で出力されます.
keytool -list -rfc -keystore hello.keystore -storepass 123456
証明書のエクスポート:
keytool -export -alias test -keystore hello.keystore -file test.crt -storepass 123456
証明書のインポート
keytool -import -alias rootcert -file root.crt -keystore hello.keystore
証明書エントリの削除:
keytool -delete -alias ceatecert1 -keystore .keystore -storepass 123456
jdkのjarsignerツールを使用してapkファイルに署名する
jarsigner -verbose -keystore hello.keystore TestApk.apk test
署名後、次のコマンドを使用して署名が成功したかどうかを確認できます.
jarsigner -verify to_sign.apk
より詳細な検証情報を表示する必要がある場合は、次のように変更します.
jarsigner -certs -verbose -verify to_sign.apk
証明書情報の取得方法:
http://www.blogjava.net/zh-weir/archive/2011/07/19/354663.html
APk署名呼び出し隠しパッケージ
keystoneの生成(証明書と秘密鍵のセットを格納する場所)
keytool-genkey-alias(別名)hello-keyalg RSA-validity 20000-keystore hello.keystore
keystore情報の表示
keytool -list -v -keystore hello.keystore -storepass 123456
デフォルトでは、-listコマンドは証明書のMD 5フィンガープリントを印刷します.一方、-vオプションを指定すると、証明書は読み取り可能な形式で印刷され、-rfcオプションを指定すると、証明書は印刷可能な符号化形式で出力されます.
keytool -list -rfc -keystore hello.keystore -storepass 123456
証明書のエクスポート:
keytool -export -alias test -keystore hello.keystore -file test.crt -storepass 123456
証明書のインポート
keytool -import -alias rootcert -file root.crt -keystore hello.keystore
証明書エントリの削除:
keytool -delete -alias ceatecert1 -keystore .keystore -storepass 123456
jdkのjarsignerツールを使用してapkファイルに署名する
jarsigner -verbose -keystore hello.keystore TestApk.apk test
署名後、次のコマンドを使用して署名が成功したかどうかを確認できます.
jarsigner -verify to_sign.apk
より詳細な検証情報を表示する必要がある場合は、次のように変更します.
jarsigner -certs -verbose -verify to_sign.apk
証明書情報の取得方法:
package com.nec.test;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.KeyStore;
import java.security.PublicKey;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageParser;
import android.os.Bundle;
import android.os.Environment;
import android.util.DisplayMetrics;
import android.util.Log;
public class TestApkActivity extends Activity {
/** Called when the activity is first created. */
private static final String FILENAME = "cacerts.bks";
private static final String FILENAME_CERT = "ca.crt"; //test.crt \ ca.crt
private List<PublicKey> listKey = new ArrayList<PublicKey>();
private File file;
static final String IN_FILE_NAME = "c:\\Documents and Settings\\2172980000522\\TestApk.apk";
static final String OUT_FILE_NAME = "c:\\Documents and Settings\\2172980000522\\TestApk.Zip";
private final static String PATH = "/sdcard/fcding.apk"; // TestApk.apk
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// readCacerts(FILENAME);
try {
readCert(FILENAME_CERT);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
TestApkActivity activity = new TestApkActivity();
PackageInfo pi = activity.parsePackage(PATH, PackageManager.GET_SIGNATURES);
String issuerDN = null;
String subjectDN = null;
String publickey = null;
try {
byte[] signature = pi.signatures[0].toByteArray();
// String hash = md5(signature);
CertificateFactory certFactory =
CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate)
certFactory.generateCertificate(
new ByteArrayInputStream(signature));
issuerDN = cert.getIssuerDN().toString();
Log.d("TRACK", issuerDN);
subjectDN = cert.getSubjectDN().toString();
Log.d("TRACK", subjectDN);
publickey = cert.getPublicKey().toString();
Log.d("TRACK", publickey);
System.out.println("====================++++++++++++++++++++"+listKey.contains(cert.getPublicKey()) );
} catch (CertificateException e) {
e.printStackTrace();
}
}
private PackageInfo parsePackage(String archiveFilePath, int flags){
PackageParser packageParser = new PackageParser(archiveFilePath);
DisplayMetrics metrics = new DisplayMetrics();
metrics.setToDefaults();
final File sourceFile = new File(archiveFilePath);
PackageParser.Package pkg = packageParser.parsePackage(
sourceFile, archiveFilePath, metrics, 0);
if (pkg == null) {
return null;
}
packageParser.collectCertificates(pkg, 0);
return PackageParser.generatePackageInfo(pkg, null, flags, 0, 0);
}
private void readCert(String fileName) throws Exception{
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream in = getAssets().open(fileName);
Certificate c = cf.generateCertificate(in);
PublicKey publicKey = c.getPublicKey();
listKey.add(publicKey);
System.out.println("********---------------**********"+publicKey.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
private void readCacerts(String filename) {
try {
InputStream inputStream = getAssets().open(filename);
KeyStore keyStore = KeyStore.getInstance("bks");
keyStore.load(inputStream, null);
file = new File(Environment.getExternalStorageDirectory(), "a.txt");
getApplication().openFileOutput("a.txt", Context.MODE_APPEND);
FileOutputStream outputStream = new FileOutputStream(file);
copyStream(keyStore, outputStream);
Log.i(TAG, "File create Success");
} catch (Exception e) {
e.printStackTrace();
}
}
private void copyStream(KeyStore keyStore, OutputStream fileOutputStream)
throws Exception {
Enumeration<String> enumeration = keyStore.aliases();
while (enumeration.hasMoreElements()) {
String element = enumeration.nextElement();
Certificate certificate = keyStore.getCertificate(element);
listKey.add(certificate.getPublicKey());
String content = certificate.toString();
System.out.println("================"+content);
fileOutputStream.write(content.getBytes());
}
}
}
http://www.blogjava.net/zh-weir/archive/2011/07/19/354663.html
APk署名呼び出し隠しパッケージ