署名认证相关知识
命令:
生成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代码- 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 签名 调用隐藏包
- 统一认证相关知识
- 手机认证相关知识
- OAUTH 认证相关知识
- IP地址的相关知识
- java(15)--Servlet中response相关知识
- 搜索引擎技术的概要以及相关知识
- c3p0 数据库连接池相关知识
- java相关面试的基础知识
- 云计算基础知识第四讲:虚拟化概念及相关概念介绍
- linux的shell函数相关知识
- Google ptorobuf相关知识
- session相关知识全接触01
- Hadoop之Spark框架研究相关知识汇总
- 使用快客引流脚本,你不得不知的引流脚本相关知识
- 详解Java中的数组与字符串相关知识
- C#反射相关知识学习
- ISAPI_Rewrite3.1相关知识
- 总结:操作系统相关知识
- Qt核心知识归类及相关资料
- JAVA相关基础知识(7)