首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显示Android证书

显示Android证书
EN

Stack Overflow用户
提问于 2016-05-11 11:53:37
回答 3查看 1.3K关注 0票数 7

我有一个简短的问题:这叫确切的回报是什么?

代码语言:javascript
复制
context.getPackageManager().getPackageInfo(context.getPackageName(), GET_SIGNATURES).signatures[0].toByteArray();

我知道它返回应用程序的第一个应用程序证书,即CERT.RSA文件夹中的META-INF,但是它返回了什么呢?只是一个字节数组,它将整个证书表示为文件还是其他字节数组?我对证书的结构和它们包含的数据不太了解,所以我真的没有任何线索。

最好的答案是给openssl一个指令,我从上面的代码行中得到返回的值。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-25 18:52:10

我终于在android模拟器上自己测试了它,得到了最终的答案。实际上,一旦我意识到PKCS7只是一个存储表单,或者更确切地说是一个用于各种签名类型的容器,就不难理解了。

在应用程序

调用返回CERT.RSA文件中的第一个签名。这是一个嵌入X.509证书的PKCS7文件,据我所读,它始终只是安卓应用程序的一个签名。

代码语言:javascript
复制
Signature sig = context.getPackageManager().getPackageInfo(context.getPackageName(), GET_SIGNATURES).signatures[0];

从上面获得的这个Signature可以直接用于生成这样一个工作的X.509证书(取自这里):

代码语言:javascript
复制
 byte[] rawCert = sig.toByteArray();
 InputStream certStream = new ByteArrayInputStream(rawCert);

 CertificateFactory certFactory;
 X509Certificate x509Cert;
 try {
      certFactory = CertificateFactory.getInstance("X509");
      x509Cert = (X509Certificate) certFactory.generateCertificate(certStream);

      //do stuff with your certificate
 } catch(Exception ex) {
      //handle exception
 }

Anywhere

如果您有您自己的android应用程序之外的证书,并且需要相同的字节流,那么上面的函数提供了这个证书,您可以使用这样一个简单的Java程序来做同样的事情:

代码语言:javascript
复制
 FileInputStream is = new FileInputStream("CERT.RSA");
 CertificateFactory cf = CertificateFactory.getInstance("X.509");
 X509Certificate c = (X509Certificate) cf.generateCertificates(is).toArray()[0];
 byte[] rawCert = c.getEncoded();

这段代码首先读取文件,然后创建CertificateFactory,然后是它在PKCS7 7容器中隔离第一个证书的重要步骤。然后c.getEncoded()最终给出了与上面的方法完全相同的表示形式。

openssl

最后但并非最不重要的是,它的openssl-command (摘自这里):

代码语言:javascript
复制
 openssl pkcs7 -inform DER -in CERT.RSA -print_certs -text

它将为您提供包含的信息的概要,并在最后给出

代码语言:javascript
复制
 -----BEGIN CERTIFICATE-----
 ...
 -----END CERTIFICATE-----

区块。它包含与上面相同的数据。如果解析该块的内容并使用base64对其进行解码,它将给出与前两个示例完全相同的字节数组。

票数 1
EN

Stack Overflow用户

发布于 2016-05-19 10:52:22

代码语言:javascript
复制
context.getPackageManager().getPackageInfo(context.getPackageName(), GET_SIGNATURES).signatures[0]

将返回与应用程序包关联的签名证书的表示形式。它将是文档中定义的这里的签名类的实例。(“签名”这个名字有点误导,甚至在文档本身中也提到过)。

代码语言:javascript
复制
context.getPackageManager().getPackageInfo(context.getPackageName(), GET_SIGNATURES).signatures[0].toByteArray();

将返回其字节数组表示形式。ie:证书文件的字节数组表示形式。

此外,证书只不过是一个文本文件,但是数据被构造成一种通用格式并进行了编码。X.509是使用最广泛的格式之一。你可以找到它,这里。X.509证书的RFC是这里。证书的结构使得如果第三方修改了证书,就可以轻松地检查它们。

没有任何直接返回byte[]的openssl命令。我能想到的最接近的是openssl命令,您可以使用该命令获取证书的文本表示。

代码语言:javascript
复制
$ openssl x509 -in <your-certificate> -noout -text
票数 0
EN

Stack Overflow用户

发布于 2016-05-25 05:06:52

PackageInfo的签名成员只是从包文件中读取的所有签名的数组。

代码语言:javascript
复制
public Signature[] signatures;

类android.content.pm.Signature将签名存储在表单中。

代码语言:javascript
复制
private final byte[] mSignature;

toByteArray()就是这样做的:

代码语言:javascript
复制
/**
 * @return the contents of this signature as a byte array.
 */
public byte[] toByteArray() {
    byte[] bytes = new byte[mSignature.length];
    System.arraycopy(mSignature, 0, bytes, 0, mSignature.length);
    return bytes;
}

因此,从本质上说,这段代码只为您提供了用于签名包的签名的字节数组。

假设CERT.RSA是apk的META文件夹中的RSA文件,您可以通过以下方法获得包MD5、SHA1和SHA256签名:

代码语言:javascript
复制
keytool -printcert -file CERT.RSA
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37161883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档