我试图重写信任管理器在Android中。 我要让底层的信任管理器中查看证书,但我需要确定一个证书已过期。 如果证书已过期,我需要忽略它,并接受证书。 一些移动设备将日期重置为旧日期,如果取出电池,造成该证书看起来好像它过期。 我的应用程序必须继续保持运行,即使出现这种情况。
我遇到的问题是,这行代码会抛出一个NullPointerException:
origTrustmanager.checkServerTrusted(certs, authType);
根据该文件,checkServerTrusted不应该抛出NullPointerExeption。 证书中有两个项目。 的authType设置为“RSA”。 如果我不实现自定义信任管理器中,将引发异常清晰地表示,该证书已过期,所以我知道底层的信托经理正在做的工作。 即使我设定的日期和时间,我的设备上的证书的有效期时间内,该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;
}
}
}
代码访问网址:
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());