Zastępowanie menedżera zaufania SSL w Androidzie

Próbuję zastąpić menedżera zaufania w Androidzie. Chcę pozwolić bazowemu menedżerowi zaufania na sprawdzenie certyfikatów, ale muszę ustalić, czy certyfikat wygasł. Jeśli certyfikat wygasł, muszę go zignorować i zaakceptować certyfikat. Niektóre urządzenia mobilne zresetują datę do starej daty, jeśli bateria zostanie usunięta, powodując, że certyfikat będzie wyglądał, jakby wygasł. Moja aplikacja musi nadal działać, nawet jeśli tak się stanie.

Problem, który mam, jest taki, że ta linia kodu zgłasza wyjątek NullPointerException:

origTrustmanager.checkServerTrusted(certs, authType);

Zgodnie z dokumentami, checkServerTrusted nigdy nie powinien rzucać NullPointerException. certyfikaty mają w sobie dwie pozycje. authType jest ustawiony na „RSA”. Jeśli nie zaimplementuję niestandardowego menedżera zaufania, zostanie zgłoszony wyjątek, który wyraźnie wskazuje, że certyfikat wygasł, więc wiem, że podstawowy menedżer zaufania wykonuje swoje zadanie. Nawet jeśli ustawię datę i godzinę w urządzeniu na czas ważności certyfikatu, powyższa linia checkServerTrusted generuje wyjątek. Czemu? Najwyraźniej robię coś złego. Oto kod mojego niestandardowego Menedżera zaufania i sposób uzyskiwania dostępu do adresu URL:

class SSLTrustManager
{
  private X509TrustManager origTrustmanager;

  public SSLTrustManager()
  {
    try
    {
      TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
      tmf.init((KeyStore) null);
      TrustManager[] trustManagers = tmf.getTrustManagers();
      this.origTrustmanager = (X509TrustManager) trustManagers[0];
    }
    catch (Exception ex)
    {
    }
  }

  public javax.net.ssl.SSLSocketFactory GetSocketFactory()
  {
    try
    {
      TrustManager[] wrappedTrustManagers = new TrustManager[] {
          new X509TrustManager()
          {
            public java.security.cert.X509Certificate[] getAcceptedIssuers()
            {
              return origTrustmanager.getAcceptedIssuers();
            }

            public void checkClientTrusted(X509Certificate[] certs, String authType)
            {
              try
              {
                origTrustmanager.checkClientTrusted(certs, authType);
              }
              catch (CertificateException e)
              {
              }
            }

            public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException
            {
              try
              {
                origTrustmanager.checkServerTrusted(certs, authType);
              }
              catch(Exception ex)
              {
              }
            }
          }
       };

      SSLContext sslContext = SSLContext.getInstance("SSL");
      sslContext.init(null, wrappedTrustManagers, new java.security.SecureRandom());
      javax.net.ssl.SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
      return sslSocketFactory;
    }
    catch (Exception ex)
    {
      return null;
    }
  }
}    

Kod dostępu do adresu URL:

SSLTrustManager sslTrustManager = new SSLTrustManager();
HttpsURLConnection.setDefaultSSLSocketFactory(sslTrustManager.GetSocketFactory());

URL siteUrl = new URL(url);
HttpsURLConnection conn = (HttpsURLConnection) siteUrl.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);

DataOutputStream out = new DataOutputStream(conn.getOutputStream());

questionAnswers(2)

yourAnswerToTheQuestion