2017-08-06 62 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免费提供这些服务。