署名認証に関する知識

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 
 
 
 
 
 
 
 
証明書情報の取得方法:
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署名呼び出し隠しパッケージ