2016-11-05 256 views
6

Я разрабатываю проект для Android.Правильный способ установить сертификат PEM на Android

У меня есть строка сертификата PEM:

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

(назначен выше строки сертификата переменной с именем CERT_STR)

Я дешифровать выше PEM строки в массив байтов:

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

I попробуйте программно установить сертификат PEM на мой телефон Android по следующему коду:

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); 

При запуске мой код (в Android 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 С.Ю. stem думаю, я устанавливаю хранилище ключей PKCS # 12. Зачем?

  2. Каков правильный способ программной установки сертификата PEM на Android?

+0

'поток не являются ключевым store' PKCS12 какой-либо причины не пытаться преобразовать его к PKCS12, то? –

+0

Но я все еще хочу знать, как правильно установить PEM в Android, вот в чем мой вопрос. –

+0

Это, по-видимому, точный дубликат https://stackoverflow.com/questions/40464815/install-x509-certificate-programmatically-in-my-case – ozbek

ответ

0

Ваш код должен работать, как сказал @Sergey Nikitin. Это starred example в Github использует аналогичный код

Я рассмотрел исходный код Android 7.1 для CredentialHelper и CertInstaller, чтобы отслеживать журнал исключений. Уникальный достижимы путь, чтобы выполнить pkcs12 погрузчик на

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

метод onScreenlockOk

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

который защищен CredentialHelper.hasPkcs12KeyStore()

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

я не нашел по умолчанию присвоены значения или альтернативных путей , поэтому я выводю, что KeyChain.EXTRA_PKCS12 используется в некотором роде. Это странное поведение, может быть, у вас есть проблема с восстановлением &?

Я предлагаю для отладки коды, включая класс Android CertInstaller для обеспечения значения Extras и убедитесь, что исполняемый код ожидаемого