2

アプリをアプリと拡張機能に分割する必要があります。そこで、Google Play Downloader Library (android-sdk\extras\google\play_apk_expansion\downloader_sample) の例を取り上げました。プロジェクトは正常にビルドされますが、でクラッシュします

byte[] decodedKey = Base64.decode(encodedPublicKey);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_FACTORY_ALGORITHM); // "RSA"
return keyFactory.generatePublic(new X509EncodedKeySpec(decodedKey));<code>

、文字列 keyFactory.generatePublic で。src\com\google\android\vending\licensing\LicenseChecker.java からのものです (android-sdk\extras\google\play_licensing\library\src) エラー:

E/AndroidRuntime(523): java.lang.IllegalArgumentException: java.security.spec.InvalidKeySpecException: java.lang.IllegalArgumentException: Bad sequence size: 3

キーは次のようになります。

private static final String BASE64_PUBLIC_KEY =
"MIIB5TCCAU6gAwIBAgIET45f9zANBgkqhkiG9w0BAQUFADA3MQswCQYDVQQGEwJVUzEQMA4GA1UE" +
"ChMHQW5kcm9pZDEWMBQGA1UEAxMNQW5kcm9pZCBEZWJ1ZzAeFw0xMjA0MTgwNjMyMjNaFw00MjA0" +
"MTEwNjMyMjNaMDcxCzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdBbmRyb2lkMRYwFAYDVQQDEw1BbmRy" +
"b2lkIERlYnVnMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDh2IN5HhCp1X+gLaga06VXr/MZ" +
"JpkzhxMdg5yWyOkj50ZDCPywAh8LcNEih9XjYswAXwRHxZpUy9VFqgGcku33AAdHxyK7KK4ge7u5" +
"a7KY11CJhxMUbOGezGldMUTwBA0ZSuObfW402I4Y4ciAsMrOnhZqSTI/tTdAWv6cPTiJQQIDAQAB" +
"MA0GCSqGSIb3DQEBBQUAA4GBAAZ89R7OMtkQnGpE6s/crqUMysAXOaHktrr6mV/4VknoLHWJUsRg" +
"iv34rAFpd1SDg0HS8HklIymcwFkrewwx9MzryYtZEdBjvo2EeTz5u8nxQNz9sqChaya0oSXB/VI8" +
"nZBnoJ+n5Zbj7QfIgG7thrT4+n4pIDO83+E6zVW6RnIh";

キーをランダムな文字列に変更すると、次のようになります。

E/AndroidRuntime(478): java.lang.IllegalArgumentException: java.security.spec.InvalidKeySpecException: java.lang.ClassCastException: com.android.org.bouncycastle.asn1.DERApplicationSpecific cannot be cast to com.android.org.bouncycastle.asn1.ASN1Sequence

キー仕様を生成しようとしましたが、エラーは発生しませんが、それは必要なものではありません:

RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger("12345678", 16), new BigInteger("11", 16));
KeyFactory keyFactory = KeyFactory.getInstance(KEY_FACTORY_ALGORITHM);
return keyFactory.generatePublic(pubKeySpec);

証明書の生成とエクスポートを再確認しました。それは正しいように見えます。鍵ペアの生成:

keytool.exe -genkey -keyalg "RSA" -keysize 2048 -v -keystore key2.store -storepass <storepwd> -keypass <keypwd>

、 書き出す

keytool.exe -export -rfc -storepass <storepwd> -keystore key2.store -file key222.cer

デバッグコードです。リリースでは Google Play の公開鍵を使用します。x.509 証明書をハードコードしてアプリで使用する正しい方法は何ですか?

4

1 に答える 1

3

これは有効なエンコードされた公開鍵ではありません。Android デバッグ証明書のようです。証明書には公開鍵が含まれていますが、公開鍵 != 証明書であることに注意してください。また、任意の 2 つの BigInteger は有効なキー ペアを構成しないことに注意してください (少なくとも素数でなければなりません)。実際の証明書を解析するには、次のようなものが必要です。

FileInputStream fis = new FileInputStream(filename);
BufferedInputStream bis = new BufferedInputStream(fis);

CertificateFactory cf = CertificateFactory.getInstance("X.509");
Certificate cert = cf.generateCertificate(bis);

正確に何をしようとしていますか?

于 2012-05-28T09:18:02.800 に答える