Anulando el SSL Trust Manager en Android

Estoy tratando de anular el administrador de confianza en Android. Quiero permitir que el administrador de confianza subyacente verifique los certificados, pero debo determinar si un certificado está vencido. Si el certificado ha caducado, debo ignorarlo y aceptar el certificado. Algunos dispositivos móviles restablecerán la fecha a una fecha anterior si se retira la batería, lo que hace que el certificado parezca como caducado. Mi aplicación debe continuar funcionando incluso si esto sucede.

El problema que tengo es que esta línea de código lanza una NullPointerException:

origTrustmanager.checkServerTrusted(certs, authType);

De acuerdo con los documentos, checkServerTrusted nunca debe lanzar una NullPointerExeption. certs tiene dos elementos en ella. authType se establece en "RSA". Si no implemento un Trust Manager personalizado, se lanzará una excepción que indicará claramente que el certificado ha caducado, así que sé que el Trust Manager subyacente está haciendo su trabajo. Incluso si configuro la fecha y la hora en mi dispositivo para que estén dentro del tiempo de validez del certificado, la línea checkServerTrusted anterior genera una excepción. ¿Por qué? Claramente estoy haciendo algo mal. Aquí está el código de mi administrador de confianza personalizado y cómo estoy accediendo a la 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;
    }
  }
}    

Código para acceder a una 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());

Respuestas a la pregunta(2)

Su respuesta a la pregunta