您的位置:首页 > 其它

署名认证相关知识

2012-11-27 12:25 120 查看

命令:

生成keystone(存放一组证书和私钥的地方)

keytool -genkey -alias(别名) hello -keyalg  RSA -validity 20000 -keystore hello.keystore

 

查看keystore 信息

keytool -list  -v -keystore hello.keystore -storepass 123456  

 

缺省情况下,-list 命令打印证书的 MD5 指纹。而如果指定了 -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 

 

 

 

 

 

 

 

获取证书信息相关方法:

Java代码  
  1. package com.nec.test;  
  2.   
  3.   
  4.   
  5. import java.io.ByteArrayInputStream;  
  6. import java.io.File;  
  7. import java.io.FileInputStream;  
  8. import java.io.FileOutputStream;  
  9. import java.io.InputStream;  
  10. import java.io.OutputStream;  
  11. import java.security.KeyStore;  
  12. import java.security.PublicKey;  
  13. import java.security.cert.Certificate;  
  14. import java.security.cert.CertificateException;  
  15. import java.security.cert.CertificateFactory;  
  16. import java.security.cert.X509Certificate;  
  17. import java.util.ArrayList;  
  18. import java.util.Enumeration;  
  19. import java.util.List;  
  20.   
  21. import android.app.Activity;  
  22. import android.content.Context;  
  23. import android.content.pm.PackageInfo;  
  24. import android.content.pm.PackageManager;  
  25. import android.content.pm.PackageParser;  
  26. import android.os.Bundle;  
  27. import android.os.Environment;  
  28. import android.util.DisplayMetrics;  
  29. import android.util.Log;  
  30.   
  31. public class TestApkActivity extends Activity {  
  32.     /** Called when the activity is first created. */  
  33.     private static final String FILENAME = "cacerts.bks";  
  34.       
  35.     private static final String FILENAME_CERT = "ca.crt"; //test.crt \ ca.crt  
  36.   
  37.     private List<PublicKey>  listKey = new ArrayList<PublicKey>();  
  38.     private File file;  
  39.     static final String IN_FILE_NAME = "c:\\Documents and Settings\\2172980000522\\TestApk.apk";  
  40.     static final String OUT_FILE_NAME = "c:\\Documents and Settings\\2172980000522\\TestApk.Zip";  
  41.      private final static String PATH = "/sdcard/fcding.apk"; // TestApk.apk   
  42.   
  43.     @Override  
  44.     public void onCreate(Bundle savedInstanceState) {  
  45.         super.onCreate(savedInstanceState);  
  46.         setContentView(R.layout.main);  
  47. //        readCacerts(FILENAME);  
  48.         try {  
  49.             readCert(FILENAME_CERT);  
  50.         } catch (Exception e1) {  
  51.             // TODO Auto-generated catch block  
  52.             e1.printStackTrace();  
  53.         }  
  54.         TestApkActivity activity  = new TestApkActivity();  
  55.         PackageInfo pi =  activity.parsePackage(PATH, PackageManager.GET_SIGNATURES);  
  56.         String issuerDN = null;    
  57.         String subjectDN = null;    
  58.         String publickey = null;    
  59.           
  60.   
  61.         try {    
  62.             byte[] signature = pi.signatures[0].toByteArray();    
  63.             // String hash = md5(signature);    
  64.             CertificateFactory certFactory =    
  65.             CertificateFactory.getInstance("X.509");    
  66.             X509Certificate cert = (X509Certificate)    
  67.             certFactory.generateCertificate(    
  68.                     new ByteArrayInputStream(signature));    
  69.   
  70.             issuerDN = cert.getIssuerDN().toString();    
  71.             Log.d("TRACK", issuerDN);    
  72.             subjectDN = cert.getSubjectDN().toString();    
  73.             Log.d("TRACK", subjectDN);    
  74.             publickey = cert.getPublicKey().toString();    
  75.             Log.d("TRACK", publickey);    
  76.         System.out.println("====================++++++++++++++++++++"+listKey.contains(cert.getPublicKey()) );  
  77.               
  78.         } catch (CertificateException e) {    
  79.             e.printStackTrace();    
  80.         }    
  81.         
  82.           
  83.     }  
  84.       
  85.       
  86.       
  87.       private PackageInfo parsePackage(String archiveFilePath, int flags){  
  88.                   PackageParser packageParser = new PackageParser(archiveFilePath);  
  89.                   DisplayMetrics metrics = new DisplayMetrics();  
  90.                   metrics.setToDefaults();  
  91.                   final File sourceFile = new File(archiveFilePath);  
  92.                   PackageParser.Package pkg = packageParser.parsePackage(  
  93.                           sourceFile, archiveFilePath, metrics, 0);  
  94.                   if (pkg == null) {  
  95.                      return null;  
  96.                  }  
  97.                  packageParser.collectCertificates(pkg, 0);   
  98.                  return PackageParser.generatePackageInfo(pkg, null, flags, 0, 0);  
  99.              }  
  100.         
  101.         
  102.       private  void  readCert(String fileName) throws  Exception{  
  103.           try {  
  104.               CertificateFactory cf = CertificateFactory.getInstance("X.509");  
  105.               InputStream in = getAssets().open(fileName);  
  106.   
  107.                Certificate c = cf.generateCertificate(in);  
  108.                PublicKey publicKey = c.getPublicKey();  
  109.                listKey.add(publicKey);  
  110.                System.out.println("********---------------**********"+publicKey.toString());  
  111.         } catch (Exception e) {  
  112.             e.printStackTrace();  
  113.         }  
  114.           
  115.       }  
  116.         
  117.       private void readCacerts(String filename) {  
  118.         try {  
  119.             InputStream inputStream = getAssets().open(filename);  
  120.             KeyStore keyStore = KeyStore.getInstance("bks");  
  121.             keyStore.load(inputStream, null);  
  122.             file = new File(Environment.getExternalStorageDirectory(), "a.txt");  
  123.             getApplication().openFileOutput("a.txt", Context.MODE_APPEND);  
  124.             FileOutputStream outputStream = new FileOutputStream(file);  
  125.             copyStream(keyStore, outputStream);  
  126.             Log.i(TAG, "File create Success");  
  127.         } catch (Exception e) {  
  128.                 e.printStackTrace();  
  129.         }  
  130.     }  
  131.   
  132.     private void copyStream(KeyStore keyStore, OutputStream fileOutputStream)  
  133.             throws Exception {  
  134.         Enumeration<String> enumeration = keyStore.aliases();  
  135.         while (enumeration.hasMoreElements()) {  
  136.             String element = enumeration.nextElement();  
  137.             Certificate certificate = keyStore.getCertificate(element);  
  138.             listKey.add(certificate.getPublicKey());  
  139.             String content = certificate.toString();  
  140.             System.out.println("================"+content);  
  141.             fileOutputStream.write(content.getBytes());  
  142.         }  
  143.     }  
  144. }  
 

http://www.blogjava.net/zh-weir/archive/2011/07/19/354663.html

    APk  签名 调用隐藏包

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: