okHttp是基于client连接的,所有的网络连接https都要遵循几次握手才能数据相互传输,因为https的单向或者双向加密的,所以要想访问,就需要ssl证书。
对于想用他爬取一些网络数据以及模拟登陆一些网站的时候,https很大的程度加深了我们项目开发的难度,因为要匹配https。
那么对于我们并不是要开发我们公司或者自己的客户端,而是爬取或者登陆别人的网站的时候,我们大多数是不需要https的,大多数提供https的网站,是可以直接拿到网页源码等的,但是在有些网站开启了强制https验证的时候,我们如果直接访问https,就会访问出错。
那么需要我们重写okhttp提供的sslSocketFactory和hostnameVerifier类来伪造一个证书达到绕过https验证的方法。
使用如下的方法即可
private static OkHttpClient getUnsafeOkHttpClient() {
try {
// Create a trust manager that does not validate certificate chains
final TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(sslSocketFactory);
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
OkHttpClient okHttpClient = builder.build();
return okHttpClient;
} catch (Exception e) {
throw new RuntimeException(e);
}
}调用方法为
OkHttpClient client = getUnsafeOkHttpClient();如果有其他的功能更改,在这个方法里面修改即可。
这样方法强制性的https,就可以绕过了
OkHttp 跳过HTTPS验证实现
okHttp在进行网络请求时,默认需要遵循HTTPS的加密握手过程。但在爬虫或模拟登录等场景中,若目标网站开启强制HTTPS验证,会增加开发复杂性。本文介绍如何通过重写okhttp的sslSocketFactory和hostnameVerifier,伪造证书以绕过HTTPS验证,从而正常访问这些网站。只需调用特定方法,即可实现HTTPS验证的规避。
8967

被折叠的 条评论
为什么被折叠?



