2016-11-05 2 views
6

Ich entwickle ein Android-Projekt.Eine geeignete Methode zur Installation von PEM-Zertifikat in Android

Ich habe eine PEM-Zertifikat string:

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

(oben Zertifikat String einer Variablen zugewiesen CERT_STR genannt)

I oben PEM Zeichenfolge Bytedatenfeld dekodieren:

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

I Versuchen Sie, das PEM-Zertifikat programmatisch auf meinem Android-Telefon zu installieren, indem Sie folgenden Code eingeben:

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

Wenn mein Code ausführen (in Android 7-Gerät), das Android-System-Zertifikat-Installations app öffnet das Fenster, wenn ich auf "OK" Taste in diesem Fenster drücken, habe ich log folgende:

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) 

Meine Fragen:

  1. ich verwendet habe EXTRA_CERTIFICATE & Set es intent, ich bin nicht mit EXTRA_PKCS12, aber aus dem Protokoll, Android sy Stamm denkt, dass ich PKCS # 12 Schlüsselspeicher installiere. Warum?

  2. Was ist die korrekte Methode zur programmgesteuerten Installation des PEM-Zertifikats in Android?

+0

'Strom stellt keine PKCS12 Schlüssel store' keinen Grund zu versuchen, es nicht konvertieren zu PKCS12 dann? –

+0

Aber ich möchte immer noch wissen, was die richtige Methode ist, um PEM in Android zu installieren, das ist der Punkt meiner Frage. –

+0

Dies scheint genaues Duplikat von https://stackoverflow.com/questions/40464815/install-x509-certificate-programmatical-in-my-case zu sein – ozbek

Antwort

0

Ihr Code sollte funktionieren, wie gesagt @Sergey Nikitin. Dieses markierte example bei Github verwendet ähnlichen Code

Ich habe den Android 7.1-Quellcode von CredentialHelper und CertInstaller überprüft, um Ihr Ausnahmeprotokoll zu verfolgen. Die einzigartige erreichbar Pfad an den pkcs12 Lader auszuführen

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

ist die Methode onScreenlockOk

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

die durch geschützt CredentialHelper.hasPkcs12KeyStore()

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

Ich habe nicht vorbelegt Werte oder alternative Pfade gefunden , so folge ich, dass KeyChain.EXTRA_PKCS12 in irgendeiner Weise verwendet wird. Es ist ein merkwürdiges Verhalten, möglicherweise haben Sie ein sauberes & Wiederherstellungsproblem?

Ich schlage vor, den Code einschließlich Android CertInstaller Klasse zu debuggen, die Werte der Extras zu gewährleisten und sicherzustellen, dass die ausgeführten Code der erwartet wird

Verwandte Themen