Переопределение SSL Trust Manager в Android

Я пытаюсь переопределить менеджер доверия в Android. Я хочу позволить основному доверенному менеджеру проверять сертификаты, но мне нужно определить, истек ли срок действия сертификата. Если срок действия сертификата истек, мне нужно его проигнорировать и принять сертификат. Некоторые мобильные устройства сбрасывают дату на старую дату, если батарея извлечена, в результате чего сертификат выглядит так, как если бы он истек. Мое приложение должно продолжать работать, даже если это произойдет.

У меня проблема в том, что эта строка кода генерирует исключение NullPointerException:

origTrustmanager.checkServerTrusted(certs, authType);

Согласно документам, checkServerTrusted никогда не должен выдавать NullPointerExeption. Certs имеет две вещи в нем. Для authType установлено значение «RSA». Если я не реализую пользовательский Trust Manager, будет сгенерировано исключение, которое ясно указывает на то, что срок действия сертификата истек, поэтому я знаю, что основной Trust Manager выполняет свою работу. Даже если я установил дату и время на моем устройстве в пределах срока действия сертификата, строка checkServerTrusted выше генерирует исключение. Почему? Очевидно, я делаю что-то не так. Вот код для моего собственного диспетчера доверия и как я получаю доступ к 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;
    }
  }
}    

Код для доступа к 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());

Ответы на вопрос(2)

Ваш ответ на вопрос