从CERT.RSA中提取证书

原文链接:http://www.wangchen.org/2011/01/%E4%BB%8Ecert-rsa%E4%B8%AD%E6%8F%90%E5%8F%96%E8%AF%81%E4%B9%A6/


Apk 包中的META-INF目录下,有一个CERT.RSA,它是一个PKCS7 格式的文件。

下面介绍几种从中获取证书的方法。

Linux command line

openssl pkcs7 -inform DER -in CERT.RSA -noout -print_certs -text

你可以得到一个文本输出:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1281971851 (0x4c69568b)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: CN=Michael Liu
        Validity
            Not Before: Aug 16 15:17:31 2010 GMT
            Not After : Aug 10 15:17:31 2035 GMT
        Subject: CN=Michael Liu
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:8d:04:84:a2:1e:c6:56:39:f2:cd:a6:f0:48:a5:
                    f7:5e:71:8f:e1:a8:af:a7:dc:66:92:a2:b9:cf:da:
                    0f:32:42:ce:83:fe:bc:e1:4f:0a:fd:d9:a8:b3:73:
                    f4:ff:97:15:17:87:d6:d0:3c:da:01:fc:11:40:7d:
                    04:da:31:cc:cd:da:d0:e7:7b:e3:c1:84:30:9f:21:
                    93:95:20:48:b1:2d:24:02:d2:b9:3c:87:0d:fa:b8:
                    e1:b1:45:f4:8d:90:0a:3b:9d:d8:8a:9a:96:d1:51:
                    23:0e:8e:c4:09:68:7d:95:be:c6:42:e9:54:a1:5c:
                    5d:3f:25:d8:5c:c3:42:73:21
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha1WithRSAEncryption
        78:3c:6b:ef:71:70:55:68:28:80:4d:f8:b5:cd:83:a9:01:21:
        2a:c1:e4:96:ad:bc:5f:67:0c:cd:c3:34:51:6d:63:90:a9:f9:
        d5:5e:c7:ef:34:43:86:7d:68:e1:99:87:92:86:34:91:6d:67:
        6d:b2:22:e9:5e:28:aa:e8:05:52:04:6e:4e:d4:7f:0f:b0:d6:
        28:f5:2b:11:38:d5:15:cb:e3:e4:c9:99:23:c1:84:4f:ce:69:
        e9:b1:59:7b:8e:30:01:1c:e1:92:ee:0d:54:61:29:f5:8e:9e:
        42:72:26:2b:aa:c7:af:d9:c9:d1:85:95:8e:4c:8d:5c:77:c5:
        ce:4e

Java

这是最简单的

import sun.security.pkcs.PKCS7;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

public class Test {
    public static void main(String[] args) throws CertificateException, IOException {
        FileInputStream fis = new FileInputStream("/Users/wangchen/Desktop/CERT.RSA");
        PKCS7 pkcs7 = new PKCS7(fis);
        X509Certificate publicKey = pkcs7.getCertificates()[0];

        System.out.println("issuer1:" + publicKey.getIssuerDN());
        System.out.println("subject2:" + publicKey.getSubjectDN());
        System.out.println(publicKey.getPublicKey());
    }
}

使用openssl-dev 的C API

#include <openssl/bio.h>
#include <openssl/x509.h>
#include <openssl/pkcs7.h>
#include <string>
#include <iostream>
using namespace std;
string to_string(X509_NAME* name)
{
    BIO* mem = BIO_new(BIO_s_mem());
    if (mem == NULL)
        return NULL;

    if (X509_NAME_print_ex(mem, name, 0, XN_FLAG_RFC2253) < 0)         return NULL;     string str;     char buf[128];     while((BIO_gets(mem, &buf[0], sizeof(buf))) > 0)
    {
        str.append(buf);
    }
    BIO_free(mem);
    return str;
}

int main()
{
	FILE* fp;
    if (!(fp = fopen("CERT.RSA", "rb")))
    {
        fprintf(stderr, "Error reading input pkcs7 file\n" );
        exit(1);
    }
	/* todo: 这里可能有内存漏洞,有空查一下文档 */
    PKCS7* pkcs7 = d2i_PKCS7_fp(fp, NULL);
    X509* cert = sk_X509_pop(pkcs7->d.sign->cert);
    string subject = to_string(X509_get_subject_name(cert));
    string issuer = to_string(X509_get_issuer_name(cert));
    char *modulus = BN_bn2dec(X509_get_pubkey(cert)->pkey.rsa->n);
    cout << subject << endl;
    OPENSSL_free(modulus);
    fclose(fp);
    return 0;
}

Python

我没在Python 2.x 的OpenSSL 库中找到从PKCS7中提取证书的方法……
看来无奈时刻只能自己做Binding了。

这个工具前后用了好多天的时间查阅资料并不断修改才完成。本工具可以用于读取apk包的大量信息,无其他依赖。可以直接通过命令行运行,也可以当作架包使用。 命令行方式使用举例: 获取AndroidManifest.xml文件中定义的versionCode: java -jar ApkAnalysis.jar “apk路径” -versionCode 获取apk证书详情: java -jar ApkAnalysis.jar “apk路径” -certs 获取apk证书中的第一条的详情: java -jar ApkAnalysis.jar “apk路径” -certs 0 获取证书摘要(百度、高德地图等API中需要的那个SHA1): java -jar ApkAnalysis.jar “apk路径” -certs 0 SHA1 获取apk发布者信息: java -jar ApkAnalysis.jar “apk路径” -certs 0 issuer 获取apk声明的权限: java -jar ApkAnalysis.jar “apk路径” -permissions 当作为架包使用时,通过 ApkAnalysis apkAnalysis = ApkAnalysis.getApkReader(apkFilePath); 获取到ApkAnalysis的实例,然后就调用对应方法读取即可。相信都会使用自动补全等功能吧?那个会告诉你有哪些可用的方法,这里不例举了。 输入 java -jar ApkAnalysis.jar -help会给出如下提示,请慢慢研究。如果好用,请不吝评价一下,谢谢~至于源码么,会反编译的就反编译吧,我也拦不住的,纯Java写的,还是很好反编译的,也没有代码混淆过。感兴趣愿意一起交流的可以留言问我要,纯粹伸手党就算了。 Apk分析工具 v1.0.7 编译时JDK版本:1.6.0_33 当前JRE版本:1.6.0_33 作者:周骞 发布日期:2015-01-08 --------------------------------------------------- ApkAnalysis [-versionCode] [-versionName] [-packageName]... 可用的选项: -versionCode 版本号 -versionName 版本名称,如1.0.3 -packageName Apk包名 -certs [index] [MD5|SHA1|issuer|subject|validity] 获取证书信息 -verify 校验apk内文件的签名,并列出未通过校验的文件 -permissions 获取apk所需的权限 -features 获取apk所需的特性 -activities [detail] 获取apk所含的Activity -services [detail] 获取apk所含的Service -receivers [detail] 获取apk所含的静态Receiver -content [name] 获取AndroidManifest.xml中的内容 -extract 抽取apk中的文件 -h[elp] 显示此帮助信息 --------------------------------------------------- 如在程序中引用本包,方法如下: ApkAnalysis apkAnalysis = ApkAnalysis.getApkReader(apkFilePath); 需要判断apkAnalysis是否为null,为null表示读取失败,不为null时即可调用getXX()获取数据
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值