您的位置:首页 > 理论基础 > 计算机网络

android https 绕证书

2017-06-26 15:52 225 查看
       之前很长一段时间开发android开发 网络通信都是用的http,后来到了现在的公司,网络通信是https,理论上https比http更加安全,但是公司是自建证书(后来问了一些朋友有的公司为了降低成本都没有买,都是自建证书),所以通信的过程需要绕开证书(也可以叫做信任证书),http和https在通信过程中是有一点不一样的,废话不多说直接上源码 我通信这一块用到的是RxAndroid+RxJava+OkHttp3,目前比较主流的网络请求框架。

    

import android.util.Log;

import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.concurrent.TimeUnit;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import rx.Observable;
import rx.Subscriber;

/**
* Created by mrpanda on 4/5/17.
*/

public class HTTPSRequestUtils {
private static OkHttpClient okHttpClient;
public static final MediaType JSON
= MediaType.parse("application/json; charset=utf-8");

public static Observable<String> getJson(final String path, final String json){
return Observable.create(new Observable.OnSubscribe<String>(){

@Override
public void call(Subscriber<? super String> subscriber) {
if(!subscriber.isUnsubscribed()){
okHttpClient = new OkHttpClient.Builder()
.sslSocketFactory(createSSLSocketFactory())
.hostnameVerifier(new TrustAllHostnameVerifier())
.connectTimeout(60, TimeUnit.SECONDS)
.writeTimeout(100, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.build();
RequestBody requestBody= RequestBody.create(JSON,json);
Request request=new Request.Builder()
.url(path)
.post(requestBody)
.build();
try{
Response response= okHttpClient.newCall(request).execute();
Log.e("response",response.toString());
if(response.isSuccessful()){
subscriber.onNext(response.body().string());
}else{
subscriber.onNext("获取失败!");
}
subscriber.onCompleted();
}catch (Exception e){
e.printStackTrace();

}
}
}
});

}
private static class TrustAllCerts implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}

@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}

@Override
public X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];}
}
private static class TrustAllHostnameVerifier implements HostnameVerifier {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
}
private static SSLSocketFactory createSSLSocketFactory() {
SSLSocketFactory ssfFactory = null;

try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null,  new TrustManager[] { new TrustAllCerts() }, new SecureRandom());

ssfFactory = sc.getSocketFactory();
} catch (Exception e) {
}

return ssfFactory;
}

}

   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息