2017-08-06 61 views
0
public static SSLContext getSSL() { 
     try { 
      CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
      AssetManager assetManager = App.getAppContext() 
        .getAssets(); 
      InputStream caInput = assetManager.open("cert.pem"); 
      java.security.cert.X509Certificate ca = null; 
      try { 
       ca = (java.security.cert.X509Certificate) cf 
         .generateCertificate(caInput); 
      } catch (Exception er) { 

      } finally { 
       caInput.close(); 
      } 
      String keyStoreType = KeyStore.getDefaultType(); 
      KeyStore keyStore = KeyStore.getInstance(keyStoreType); 
      keyStore.load(null, null); 
      keyStore.setCertificateEntry("ca", 
        ca); 
      String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); 
      TrustManagerFactory tmf = TrustManagerFactory 
        .getInstance(tmfAlgorithm); 
      tmf.init(keyStore); 
      SSLContext context = SSLContext.getInstance("TLS"); 
      context.init(null, tmf.getTrustManagers(), null); 
      return context; 
     } catch (Exception e1) { 
      return null; 
     } 
    } 

所以我使用的功能,這是工作,當我調用下面的函數強制在Android應用程序更新證書。質子交換膜

((HttpsURLConnection) conn).setSSLSocketFactory(Common 
            .getSSL().getSocketFactory() 

然而,當我的客戶告訴我的新問題arrised證書,並且我需要用新證書更新我的應用程序才能正常工作。我的問題是,對此有何正確方法?爲什麼我需要每次更新應用程序中的證書?我在asssets文件夾中。我應該每次從某處下載證書嗎?不更新應用程序的人將因爲舊證書而無法使用應用程序

回答

1

目前,您只是向問題中拋出一些代碼而未解釋其確切用途。我的猜測是你用它來對待你的客戶給你的一個特定的自簽證書作爲可信。這意味着如果證書在服務器端更改,客戶端(即應用程序或至少應用程序使用的cert.pem文件)需要更新。

處理證書更新的常用方法不是首先使用自簽名證書。應該使用由公共CA頒發的證書,因爲應用程序將接受內置信任存儲中的任何CA頒發的任何證書,前提是該證書是爲期望的站點頒發的。這種方式即使頻繁的證書更新也沒有問題,應用程序也不需要更新以接受新證書。

我建議您與您的客戶談談,從自簽名證書轉移到使用公共證書的既定方法。這些並不昂貴,即CA就像Let's Encrypt免費提供這些服務。