2016-11-05 72 views
6

私はAndroidプロジェクトを開発中です。PEM証明書をAndroidにインストールする適切な方法

Iは、PEM証明書文字列を持っている:

-----BEGIN CERTIFICATE----- 
MIIEczCCA1ugAwIBAgIBADANBgkqhkiG9w0BAQQFAD..AkGA1UEBhMCR0Ix 
EzARBgNVBAgTClNvbWUtU3RhdGUxFDASBgNVBAoTC0..0EgTHRkMTcwNQYD 
VQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcn..XRpb24gQXV0aG9y 
...MANY LINES... 
It8una2gY4l2O//on88r5IWJlm1L0oA8e4fR2yrBHX..adsGeFKkyNrwGi/ 
7vQMfXdGsRrXNGRGnX+vWDZ3/zWI0joDtCkNnqEpVn..HoX 
-----END CERTIFICATE----- 

私はバイト配列にPEM列の上方復号

CERT_STRという名前の変数に証明書文字列の上に割り当てられた):

byte[] pemBytes = Base64.decode(
       CERT_STR.replaceAll("-----(BEGIN|END) CERTIFICATE-----", "") 
         .replaceAll("\n", "") 
         .getBytes("UTF-8"), 
       Base64.DEFAULT 
     ); 

I次のコードを使用して、Android携帯にプログラムでPEM証明書をインストールしてみてください:

Intent intent = KeyChain.createInstallIntent(); 
// because my PEM only contains a certificate, no private key, so I use EXTRA_CERTIFICATE 
intent.putExtra(KeyChain.EXTRA_CERTIFICATE, pemBytes);// above PEM bytes 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
context.startActivity(intent); 

(アンドロイド7デバイスに)私のコードを実行すると、Androidのシステム証明書インストーラアプリはウィンドウをポップアップ、私はそのウィンドウの「OK」ボタンを押すと、私はログを以下ました:

java.io.IOException: stream does not represent a PKCS12 key store 
    at com.android.org.bouncycastle.jcajce.provider.keystore.pkcs12.PKCS12KeyStoreSpi.engineLoad(PKCS12KeyStoreSpi.java:793) 
    at java.security.KeyStore.load(KeyStore.java:1247) 
    at com.android.certinstaller.CredentialHelper.loadPkcs12Internal(CredentialHelper.java:396) 
    at com.android.certinstaller.CredentialHelper.extractPkcs12Internal(CredentialHelper.java:364) 
    at com.android.certinstaller.CredentialHelper.extractPkcs12(CredentialHelper.java:354) 
    at com.android.certinstaller.CertInstaller$1.doInBackground(CertInstaller.java:328) 
    at com.android.certinstaller.CertInstaller$1.doInBackground(CertInstaller.java:327) 

私の質問:

  1. 私はEXTRA_CERTIFICATE &を使用していたがintentに設定し、私はEXTRA_PKCS12を使用しますが、ログ、AndroidのSYからありませんよ私はPKCS#12キーストアをインストールしていると思っています。どうして?

  2. プログラムでPEM証明書をAndroidにインストールする正しい方法は何ですか?

+0

それを変換しようとしないために 'ストリームがPKCS12キーstore'を表していない何らかの理由で期待されていることを確認することをお勧めPKCS12へ? –

+0

しかし、私はまだAndroidにPEMをインストールするための正しい方法は何かを知りたいのですが、それは私の質問のポイントです。 –

+0

これはhttps://stackoverflow.com/questions/40464815/install-x509-certificate-programmatically-in-my-case – ozbek

答えて

0

あなたのコードは@Sergey Nikitinと同じように機能するはずです。この星印を付けられたexampleはGithubで同様のコードを使用しています

例外ログをトレースするには、Android 7.1ソースコードCredentialHelperおよびCertInstallerを確認しました。

com.android.certinstaller.CredentialHelper.extractPkcs12(CredentialHelper.java:354) 

pkcs12ローダを実行するためのユニークな到達可能な経路は、方法Iは、デフォルト割り当てられた値または代替パスを見つけていないCredentialHelper.hasPkcs12KeyStore()

boolean hasPkcs12KeyStore() { 
    return mBundle.containsKey(KeyChain.EXTRA_PKCS12); 
} 

によって保護されているonScreenlockOk

private void onScreenlockOk() { 
    if (mCredentials.hasPkcs12KeyStore()) { 
     if (mCredentials.hasPassword()) { 
      showDialog(PKCS12_PASSWORD_DIALOG); 
     } else { 
      new Pkcs12ExtractAction("").run(this); 
     } 

ありますですので、私はKeyChain.EXTRA_PKCS12が何らかの形で使用されていると推測しています。それは奇妙な動作です、あなたはきれいな&の再構築の問題がありますか?

私はエクストラの値を確保するには、Android CertInstallerクラスを含むコードをデバッグし、実行されるコードが

関連する問題