2016-02-16 3 views
4

Я хочу добавить несколько сертификатов из файла ресурсов для Android KeyStore:Добавление нескольких сертификатов SSL-сертификатов для Android KeyStore не работает. (Из файла ресурсов)

if (sslContext==null) { 
     // loading CA from an InputStream 
     InputStream is = AVApplication.getContext().getResources().openRawResource(R.raw.wildcard); 
     String certificates = Converter.convertStreamToString(is); 
     String certificateArray[] = certificates.split("-----BEGIN CERTIFICATE-----"); 

     for (int i = 1; i < certificateArray.length; i++) { 
      certificateArray[i] = "-----BEGIN CERTIFICATE-----" + certificateArray[i]; 
      //LogAV.d("cert:" + certificateArray[i]); 

      // generate input stream for certificate factory 
      InputStream stream = IOUtils.toInputStream(certificateArray[i]); 

      // CertificateFactory 
      CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
      // certificate 
      Certificate ca; 
      try { 
       ca = cf.generateCertificate(stream); 
      } finally { 
       is.close(); 
      } 

      // creating a KeyStore containing our trusted CAs 
      KeyStore ks = KeyStore.getInstance("BKS"); 
      ks.load(null, null); 
      ks.setCertificateEntry("av-ca" + i, ca); 

      // TrustManagerFactory 
      String algorithm = TrustManagerFactory.getDefaultAlgorithm(); 
      TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm); 
      // Create a TrustManager that trusts the CAs in our KeyStore 
      tmf.init(ks); 

      // Create a SSLContext with the certificate that uses tmf (TrustManager) 
      sslContext = SSLContext.getInstance("TLS"); 
      sslContext.init(null, tmf.getTrustManagers(), new SecureRandom()); 
     } 

    } 

    return sslContext; 

Только последний сертификат из файла работ! Кажется, что сертификат перезаписывает другой.

файла выглядит следующим образом:

-----BEGIN CERTIFICATE----- 
    cert 
-----END CERTIFICATE----- 
-----BEGIN CERTIFICATE----- 
    cert 
-----END CERTIFICATE----- 
-----BEGIN CERTIFICATE----- 
    cert 
-----END CERTIFICATE----- 

Я надеюсь, что кто-то может мне помочь! :)

+0

Если его можно использовать инструмент вместо вас есть программа для этой цели, чем использовать [Использовать KeyStore Проводник] (http://keystore-explorer.sourceforge.net/) См. [Этот пост] (http://stackoverflow.com/questions/21847096/can-i-merge-multiple-android-keystore-files-into-one/31171778#31171778) answer – abcdef12

+2

Каждый раз, создавая новый SSLContext только с одним сертификатом. –

ответ

5

Thx to @Dan Getz, теперь он работает.

Решение:

public static SSLContext getSSLContext() throws Exception { 
     if (sslContext==null) { 
      // loading CA from an InputStream 
      InputStream is = AVApplication.getContext().getResources().openRawResource(R.raw.wildcard); 
      String certificates = Converter.convertStreamToString(is); 
      String certificateArray[] = certificates.split("-----BEGIN CERTIFICATE-----"); 

      // creating a KeyStore containing our trusted CAs 
      KeyStore ks = KeyStore.getInstance("BKS"); 
      ks.load(null, null); 
      for (int i = 1; i < certificateArray.length; i++) { 
       certificateArray[i] = "-----BEGIN CERTIFICATE-----" + certificateArray[i]; 
       //LogAV.d("cert:" + certificateArray[i]); 

       // generate input stream for certificate factory 
       InputStream stream = IOUtils.toInputStream(certificateArray[i]); 

       // CertificateFactory 
       CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
       // certificate 
       Certificate ca; 
       try { 
        ca = cf.generateCertificate(stream); 
       } finally { 
        is.close(); 
       } 

       ks.setCertificateEntry("av-ca" + i, ca); 
      } 
      // TrustManagerFactory 
      String algorithm = TrustManagerFactory.getDefaultAlgorithm(); 
      TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm); 
      // Create a TrustManager that trusts the CAs in our KeyStore 
      tmf.init(ks); 

      // Create a SSLContext with the certificate that uses tmf (TrustManager) 
      sslContext = SSLContext.getInstance("TLS"); 
      sslContext.init(null, tmf.getTrustManagers(), new SecureRandom()); 
     } 

     return sslContext; 
    } 
+0

Можете ли вы указать, является ли «подстановочный знак» файлом BKS или нет? –

+1

wildcard не является файлом BKS, это скорее файл, содержащий несколько сертификатов [PEM] (https://www.digicert.com/ssl-support/pem-ssl-creation.htm). –

Смежные вопросы