2016-11-05 11 views
6

में पीईएम प्रमाण पत्र स्थापित करने का एक उचित तरीका मैं एक एंड्रॉइड प्रोजेक्ट विकसित कर रहा हूं।एंड्रॉइड

मैं एक पीईएम प्रमाणपत्र स्ट्रिंग है:

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

मैं बाइट सरणी के लिए पीईएम स्ट्रिंग ऊपर डिकोड (प्रमाणपत्र स्ट्रिंग ऊपर CERT_STR नामक एक चर को सौंपना):

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

मैं कोड का पालन करके अपने एंड्रॉइड फोन पर प्रोग्रामेटिक रूप से पीईएम प्रमाणपत्र स्थापित करने का प्रयास करें:

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 डिवाइस में) मेरे कोड चलाने के लिए, एंड्रॉयड प्रणाली प्रमाणपत्र संस्थापक एप्लिकेशन अप विंडो, जब मैं "ओके" दबाएं कि विंडो के बटन दिखाई दे, मैं लॉग निम्नलिखित गया:

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. मैं intent को EXTRA_CERTIFICATE & सेट इसका इस्तेमाल किया, मैं EXTRA_PKCS12 उपयोग नहीं कर रहा है, लेकिन लॉग से, एंड्रॉयड एसवाई स्टेम सोचता है कि मैं पीकेसीएस # 12 कीस्टोर स्थापित कर रहा हूं। क्यूं कर?

  2. एंड्रॉइड में प्रोग्रामेटिक रूप से पीईएम प्रमाणपत्र स्थापित करने का सही तरीका क्या है?

+0

'धारा एक PKCS12 कुंजी store' किसी भी कारण से यह परिवर्तित करने की कोशिश नहीं करने का प्रतिनिधित्व नहीं करता करने के लिए एंड्रॉयड CertInstaller वर्ग सहित कोड डिबग करने के लिए सुझाव है फिर पीकेसीएस 12 के लिए? –

+0

लेकिन मैं अभी भी जानना चाहता हूं कि एंड्रॉइड में पीईएम स्थापित करने का सही तरीका क्या है, यह मेरे प्रश्न का मुद्दा है। –

+0

यह https://stackoverflow.com/questions/40464815/install-x509-certificate-programmatically-in-my-case – ozbek

उत्तर

0

आपके कोड को काम करना चाहिए, जैसा कि @ सेर्गी निकितिन ने कहा था। यह अभिनय किया example Github पर समान कोड

मैं अपने अपवाद लॉग ट्रेस करने के लिए CredentialHelper और CertInstaller के एंड्रॉयड 7.1 स्रोत कोड की समीक्षा की है उपयोग कर रहा है। अद्वितीय पहुंच योग्य पथ

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

पर pkcs12 लोडर निष्पादित करने के लिए विधि 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 किसी भी तरह से उपयोग किया जा रहा है। यह एक अजीब व्यवहार है, हो सकता है कि आपके पास & पुनर्निर्माण समस्या हो?

मैं एक्स्ट्रा के मूल्यों को सुनिश्चित करने और यह सुनिश्चित करें कि निष्पादित कोड की उम्मीद है