Переопределение 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());