HTTPS,证书有效期与手机时间不符合时,如何让验证通过
2012-09-27 13:39
706 查看
情景:公司购买了三年verisign的证书使用期,但是手机本地时间如果设为这三年以外的,会发生证书过期CertificateExpiredException或者证书尚未生效CertificateNotYetValidException的异常,这样基于https的网络交互都将无法进行下去,还需要提醒用户取更改手机时间,再回来进行网络操作,影响到用户体验。
目的:对于证书有效期引起的这两个异常,让验证通过(trust),其他原因引起的异常,按正常的逻辑处理。
方案如下:
HttpURLConnection conn;
if (baseUrl.startsWith("https")) {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[] {
new MyTrustManager()
}, new SecureRandom());
HttpsURLConnection
.setDefaultSSLSocketFactory(sc.getSocketFactory());
conn = (HttpsURLConnection) new URL(baseUrl)
.openConnection();
} else {
conn = (HttpURLConnection) new URL(baseUrl).openConnection();
}
class MyTrustManager implements X509TrustManager {
private X509TrustManager tm = null;
MyTrustManager() {
try {
//以下几步是关键,通过分析源码和异常栈而来。
KeyStore keyStore = KeyStore.getInstance("AndroidCAStore");
keyStore.load(null, null);
tm = new TrustManagerImpl(keyStore);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
tm.checkClientTrusted(chain, authType);
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
try {
tm.checkServerTrusted(chain, authType);
} catch (CertificateException e) {
e.printStackTrace();
Throwable t = e;
while (t != null) {
if (t instanceof CertificateExpiredException
|| t instanceof CertificateNotYetValidException)
return;
t = t.getCause();
}
throw e;
}
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return tm.getAcceptedIssuers();
}
}
目的:对于证书有效期引起的这两个异常,让验证通过(trust),其他原因引起的异常,按正常的逻辑处理。
方案如下:
HttpURLConnection conn;
if (baseUrl.startsWith("https")) {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[] {
new MyTrustManager()
}, new SecureRandom());
HttpsURLConnection
.setDefaultSSLSocketFactory(sc.getSocketFactory());
conn = (HttpsURLConnection) new URL(baseUrl)
.openConnection();
} else {
conn = (HttpURLConnection) new URL(baseUrl).openConnection();
}
class MyTrustManager implements X509TrustManager {
private X509TrustManager tm = null;
MyTrustManager() {
try {
//以下几步是关键,通过分析源码和异常栈而来。
KeyStore keyStore = KeyStore.getInstance("AndroidCAStore");
keyStore.load(null, null);
tm = new TrustManagerImpl(keyStore);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
tm.checkClientTrusted(chain, authType);
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
try {
tm.checkServerTrusted(chain, authType);
} catch (CertificateException e) {
e.printStackTrace();
Throwable t = e;
while (t != null) {
if (t instanceof CertificateExpiredException
|| t instanceof CertificateNotYetValidException)
return;
t = t.getCause();
}
throw e;
}
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return tm.getAcceptedIssuers();
}
}
相关文章推荐
- Android使用Https证书有效期与手机时间不符合时,如何验证通过
- 如何通过手机客户端Android、Iphone 等访问要求使用客户端证书SSL加密的https网站
- 如何通过httpd来实现https?(CA自签署证书的实现)
- 如何确定某段时间之内玩手机次数及其他各种通过传感器&GPS数据可进行的分析
- 三步解决fiddler升级后https无法通过证书验证问题
- 安装WP8 SDK出现“根据当前系统时钟或签名文件中的时间戳验证时要求的证书不在有效期内”的解决办法
- 关于httpclient 请求https (如何绕过证书验证)
- java 关于httpclient 请求https (如何绕过证书验证)
- AFNetworking允许不通过证书验证访问https(AFNetworking+SSL)
- 关于httpclient 请求https (如何绕过证书验证)
- 安装wp8sdk 当前系统时钟或签名文件中的时间戳验证时要求的证书不在有效期内。
- 解决https证书验证不通过的问题
- 如何通过手机验证注册facebook帐号
- 三步解决fiddler升级后https无法通过证书验证问题
- 如何使用Xpose绕过APP自定义证书验证去抓Https包
- 关于httpclient 请求https (如何绕过证书验证)
- 如何通过 DNS 验证方式获取Let’s Encrypt 证书的快速脚本
- 安装WP8 SDK出现“根据当前系统时钟或签名文件中的时间戳验证时要求的证书不在有效期内”的解决办法
- java 关于httpclient 请求https (如何绕过证书验证)
- 关于httpclient 请求https (如何绕过证书验证)