web-dev-qa-db-ja.com

APK署名署名を取得する方法は?

APKの署名に使用されるキーの署名を取得する方法はありますか?キーストアのキーでAPKに署名しました。プログラムで取得するにはどうすればよいですか?

58
Waypoint

PackageManagerクラスを使用して、このようなAPKの署名署名にアクセスできます http://developer.Android.com/reference/Android/content/pm/PackageManager.html

Signature[] sigs = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures;
for (Signature sig : sigs)
{
    Trace.i("MyApp", "Signature hashcode : " + sig.hashCode());
}

APKがデバッグAPKかリリースAPKかを識別する方法として、これをデバッグキーのハッシュコードと比較するために使用しました。

62
Ollie C

パッケージマネージャーは、インストールされているパッケージの署名証明書を提供します。その後、署名キーの詳細を印刷できます。

final PackageManager packageManager = context.getPackageManager();
final List<PackageInfo> packageList = packageManager.getInstalledPackages(PackageManager.GET_SIGNATURES);

for (PackageInfo p : packageList) {
    final String strName = p.applicationInfo.loadLabel(packageManager).toString();
    final String strVendor = p.packageName;

    sb.append("<br>" + strName + " / " + strVendor + "<br>");

    final Signature[] arrSignatures = p.signatures;
    for (final Signature sig : arrSignatures) {
        /*
        * Get the X.509 certificate.
        */
        final byte[] rawCert = sig.toByteArray();
        InputStream certStream = new ByteArrayInputStream(rawCert);

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

            sb.append("Certificate subject: " + x509Cert.getSubjectDN() + "<br>");
            sb.append("Certificate issuer: " + x509Cert.getIssuerDN() + "<br>");
            sb.append("Certificate serial number: " + x509Cert.getSerialNumber() + "<br>");
            sb.append("<br>");
        }
        catch (CertificateException e) {
            // e.printStackTrace();
        }
    }
}
27
Yojimbo

私の状況では、間違ったkey-storeを使用するapkが事前にインストールされています。そのため、直接インストールでは一貫性のない署名が原因で失敗します。まず署名をチェックして、スムーズにインストールできることを確認する必要があります。

ここに私のsolutionがあります。

このコード が示すように、インストールされたapkから署名を取得できます。

詳細:

Signature sig = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures[0];

次に、releaseApk hashCodeを取得して比較します。私の場合、このapkをサーバーからダウンロードし、sd_cardに入れました。

Signature releaseSig = context.getPackageManager().getPackageArchiveInfo("/mnt/sdcard/myReleaseApk.apk", PackageManager.GET_SIGNATURES).signatures[0];

最後に、hashCodeを比較します。

return sig.hashCode() == releaseSig.hashCode;

上記のコードを試しましたが、うまくいきます。 hashCodeが異なる場合、単に ninstall 古いapkを使用するか、システムアプリでデバイスがルート化されている場合は、ランタイムを使用して remove してから、新しい署名apkをインストールします。

4
Shengfeng Li