2013-02-15 18 views
13

जब मैं एप्लिकेशन शुरू करता हूं तो मैं अपने आवेदन में प्रमाणपत्र स्थापित कर रहा हूं। मैं नीचे दिए गए कुछ लिंक से गुजर चुका हूं और सफलतापूर्वक प्रमाण पत्र स्थापित करता हूं।मेरे एंड्रॉइड डिवाइस में स्थापित प्रमाणपत्र का पता लगाएं

मुझे पता है कि हम स्थापित नहीं कर सकता आया उपयोगकर्ता इंटरैक्शन के बिना चुपचाप सर्टिफिकेट। वर्तमान में मुझे नहीं पता कि जब भी उपयोगकर्ता मेरा ऐप खोलता है तो प्रॉम्प्ट को कैसे रोकें।

जब भी मेरा एप्लिकेशन वर्तमान में हर बार शुरू होता है तो उपयोगकर्ता प्रमाण पत्र स्थापित करने के लिए कहता है। क्या कोई तरीका है कि मैं यह पता लगा सकता हूं कि प्रमाणपत्र (इस मामले में मेरा प्रमाणपत्र) पहले से ही स्थापित है या नहीं, प्रोग्रामेटिक रूप से।

कोड स्निपेट जहां मैं भी आपकी जानकारी के मेरे ऐप

private void installCertificate() 
    { 
     try 
     { 
      BufferedInputStream bis = new BufferedInputStream(getAssets().open(MY_CERT)); 
      byte[] keychain = new byte[bis.available()]; 
      bis.read(keychain); 

      Intent installIntent = KeyChain.createInstallIntent(); 
      X509Certificate x509 = X509Certificate.getInstance(keychain); 
      installIntent.putExtra(KeyChain.EXTRA_CERTIFICATE, x509.getEncoded()); 
      installIntent.putExtra(KeyChain.EXTRA_NAME, MY_CERT); 
      startActivityForResult(installIntent, INSTALL_KEYCHAIN_CODE); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
     catch (CertificateException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    { 
     if (requestCode == INSTALL_KEYCHAIN_CODE) 
     { 
      switch (resultCode) 
      { 
       case Activity.RESULT_OK: 
        doTheTask(); 
        break; 
       case Activity.RESULT_CANCELED: 
        finish(); 
        break;     
       default: 
        super.onActivityResult(requestCode, resultCode, data); 
      } 
     } 
    } 

में प्रमाण पत्र को स्थापित किया है, installCertificate() onCreate से कहा जाता है()।

कृपया इसके लिए मेरी मदद करें। किसी भी मदद की सराहना की जाएगी।


क्वेरी: शीघ्र प्रमाण पत्र के नाम के लिए आता है, दर्ज किया गया टेक्स्ट के रूप में चुना और आता है पर उन्मुखीकरण परिवर्तन कटौती/कॉपी विकल्प आता है। कोई भी शरीर जानता है कि तत्काल आने पर पाठ चयन को कैसे रोकें? !!!

उत्तर

18

मैं अपने प्रमाण पत्र स्थापित किया गया है कि क्या जांच करने के लिए कोड का टुकड़ा नीचे का इस्तेमाल किया है या नहीं

try 
     { 
      KeyStore ks = KeyStore.getInstance("AndroidCAStore"); 
      if (ks != null) 
      { 
       ks.load(null, null); 
       Enumeration aliases = ks.aliases(); 
       while (aliases.hasMoreElements()) 
       { 
        String alias = (String) aliases.nextElement(); 
        java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate) ks.getCertificate(alias); 

        if (cert.getIssuerDN().getName().contains("MyCert")) 
        { 
         isCertExist = true; 
         break; 
        } 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (KeyStoreException e) { 
      e.printStackTrace(); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (java.security.cert.CertificateException e) { 
      e.printStackTrace(); 
     } 
+0

मैं अपने कोड का उपयोग कर रहा हूँ, मैं AndroidCAStore के स्थान पर क्या इस्तेमाल करना चाहिए? –

1

KeyChain.createInstallIntent, बनाया आशय प्रमाणपत्रों को इंस्टॉल करने android.security.certinstaller फोन करेगा, तो certinstaller लॉग प्रिंट होगा जब प्रमाण पत्र स्थापित होते हैं। ताकि आप प्रमाण पत्र या स्थापित नहीं है कि क्या जांच करने के लिए लॉग बिल्ली डंप कर सकते हैं। नीचे के रूप में

0

विश्वस्त CA दुकान से बंद पढ़ना (आप उर्फ ​​यदि उपयोगकर्ता प्रमाण पत्र की दुकान का नाम बदल दिया प्राप्त कर सकते हैं)

KeyStore ks = KeyStore.getInstance("AndroidCAStore"); 

केवल सीए प्रमाण पत्र लाएगा, न कि उपयोगकर्ता/ग्राहक प्रमाण पत्र। यह आवश्यक नहीं है कि क्लाइंट सर्टिफिकेट सीए प्रमाण पत्र के समान उपनाम साझा करे।

2

@ एंड्रॉइड के उत्तर में कुछ अतिरिक्त जानकारी जोड़ना (मैं अभी तक टिप्पणी नहीं कर सकता), जिसका कोड केवल मेरे लिए एंड्रॉइड 4.0 या उच्चतम उपकरणों के साथ काम करता है।

उपकरणों पूर्व कुल्फ़ी सैंडविच (एपीआई < 14) के लिए:

boolean isCertExist; 
    TrustManagerFactory tmf; 
    try { 
     tmf = TrustManagerFactory.getInstance(TrustManagerFactory 
       .getDefaultAlgorithm()); 

     tmf.init((KeyStore) null); 

     X509TrustManager xtm = (X509TrustManager) tmf.getTrustManagers()[0]; 
     for (X509Certificate cert : xtm.getAcceptedIssuers()) { 
      if (cert.getIssuerDN().getName().contains("MyCert")) { 
       isCertExist = true; 
       break; 
      } 
     } 
    } catch (NoSuchAlgorithmException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (KeyStoreException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

एंड्रॉयड 4 के साथ उपकरणों के लिए।0 और ऊपर की तरफ (एपीआई> = 14):

boolean isCertExist; 
    try 
    { 
     KeyStore ks = KeyStore.getInstance("AndroidCAStore"); 
     if (ks != null) 
     { 
      ks.load(null, null); 
      Enumeration aliases = ks.aliases(); 
      while (aliases.hasMoreElements()) 
      { 
       String alias = (String) aliases.nextElement(); 
       java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate) ks.getCertificate(alias); 

       if (cert.getIssuerDN().getName().contains("MyCert")) { 
        isCertExist = true; 
        break; 
       } 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (KeyStoreException e) { 
     e.printStackTrace(); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } catch (java.security.cert.CertificateException e) { 
     e.printStackTrace(); 
    } 
+0

इस विधि का उपयोग करके मैं कुंजीस्टोर से प्रमाण पत्र प्राप्त करता हूं, भले ही उपयोगकर्ता ने अभी तक Intent KeyStore.createInstallIntent() द्वारा खोले गए मॉडलों में पासवर्ड और प्रमाणपत्र नाम टाइप नहीं किया है। – Alex

संबंधित मुद्दे