|
@@ -32,6 +32,8 @@ public class OkHttpUtils {
|
|
public static final MediaType MEDIA_TYPE_TEXT_HTML = MediaType.parse("text/html;charset=UTF-8");
|
|
public static final MediaType MEDIA_TYPE_TEXT_HTML = MediaType.parse("text/html;charset=UTF-8");
|
|
private static final MediaType MEDIA_TYPE_FORM= MediaType.parse("application/x-www-form-urlencoded");
|
|
private static final MediaType MEDIA_TYPE_FORM= MediaType.parse("application/x-www-form-urlencoded");
|
|
|
|
|
|
|
|
+ private static final String SSL = "SSL";
|
|
|
|
+
|
|
|
|
|
|
public static final int CONNECT_TIME_OUT = 20;
|
|
public static final int CONNECT_TIME_OUT = 20;
|
|
public static final int READ_TIME = 30;
|
|
public static final int READ_TIME = 30;
|
|
@@ -56,11 +58,29 @@ public class OkHttpUtils {
|
|
|
|
|
|
/**
|
|
/**
|
|
* https 和 http
|
|
* https 和 http
|
|
- * @param ssl
|
|
|
|
|
|
+ * @param ssl 如果需要SSL认证https, ssl值为SSL, 如果ssl为空, 则为http
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
private static OkHttpClient okHttpClient(String ssl){
|
|
private static OkHttpClient okHttpClient(String ssl){
|
|
- return StringUtils.isNotBlank(ssl) && "ssl".equalsIgnoreCase(ssl) ? okHttpInstanceSsl() : okHttpInstance();
|
|
|
|
|
|
+ return StringUtils.isNotBlank(ssl) && SSL.equals(ssl) ? okHttpInstanceSsl() : okHttpInstance();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * https 和 http
|
|
|
|
+ * 如果要信息所有证书,
|
|
|
|
+ * <code>ssl</code>必须为SSL,
|
|
|
|
+ * <code>ignoreHostnameVerifier</code>为true,
|
|
|
|
+ * <code>InputStream... certificates</code>为null
|
|
|
|
+ *
|
|
|
|
+ * @param ssl
|
|
|
|
+ * @param ignoreHostnameVerifier 是否忽略Hostname验证
|
|
|
|
+ * @param certificates 证书流
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private static OkHttpClient okHttpClient(String ssl, boolean ignoreHostnameVerifier, InputStream... certificates){
|
|
|
|
+ return StringUtils.isNotBlank(ssl) && SSL.equalsIgnoreCase(ssl)
|
|
|
|
+ ? okHttpInstanceSsl(ignoreHostnameVerifier, certificates)
|
|
|
|
+ : okHttpInstance();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -73,7 +93,8 @@ public class OkHttpUtils {
|
|
OkHttpClient.Builder builder = new OkHttpClient.Builder();
|
|
OkHttpClient.Builder builder = new OkHttpClient.Builder();
|
|
builder.connectTimeout(CONNECT_TIME_OUT, TimeUnit.SECONDS)
|
|
builder.connectTimeout(CONNECT_TIME_OUT, TimeUnit.SECONDS)
|
|
.readTimeout(READ_TIME, TimeUnit.SECONDS)
|
|
.readTimeout(READ_TIME, TimeUnit.SECONDS)
|
|
- .writeTimeout(WRITE_TIME, TimeUnit.SECONDS);
|
|
|
|
|
|
+ .writeTimeout(WRITE_TIME, TimeUnit.SECONDS)
|
|
|
|
+ .retryOnConnectionFailure(true);
|
|
|
|
|
|
client = builder.build();
|
|
client = builder.build();
|
|
okHttpClientThreadLocal.set(client);
|
|
okHttpClientThreadLocal.set(client);
|
|
@@ -81,31 +102,41 @@ public class OkHttpUtils {
|
|
return client;
|
|
return client;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * OkHttpClient ssl 实例
|
|
|
|
+ * 忽略Hostname验证, 并信息所有证书
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
private static OkHttpClient okHttpInstanceSsl() {
|
|
private static OkHttpClient okHttpInstanceSsl() {
|
|
- return okHttpInstanceSsl(null);
|
|
|
|
|
|
+ return okHttpInstanceSsl(true, null);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
* OkHttpClient ssl 实例
|
|
* OkHttpClient ssl 实例
|
|
|
|
+ * 如果要信息所有证书, <code>InputStream... certificates</code>为null
|
|
|
|
+ * @param ignoreHostnameVerifier 是否忽略Hostname验证
|
|
|
|
+ * @param certificates 证书流
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
- private static OkHttpClient okHttpInstanceSsl(InputStream... certificates) {
|
|
|
|
|
|
+ private static OkHttpClient okHttpInstanceSsl(boolean ignoreHostnameVerifier, InputStream... certificates) {
|
|
OkHttpClient client = okHttpClientSslThreadLocal.get();
|
|
OkHttpClient client = okHttpClientSslThreadLocal.get();
|
|
if (client == null) {
|
|
if (client == null) {
|
|
|
|
|
|
- X509TrustManager trustManager = buildX509TrustManager(certificates);
|
|
|
|
|
|
+ X509TrustManager[] trustManager = buildX509TrustManager(certificates);
|
|
SSLSocketFactory sslSocketFactory = buildSSLSocketFactory(trustManager);
|
|
SSLSocketFactory sslSocketFactory = buildSSLSocketFactory(trustManager);
|
|
|
|
|
|
OkHttpClient.Builder builder = new OkHttpClient.Builder();
|
|
OkHttpClient.Builder builder = new OkHttpClient.Builder();
|
|
builder.connectTimeout(CONNECT_TIME_OUT, TimeUnit.SECONDS)
|
|
builder.connectTimeout(CONNECT_TIME_OUT, TimeUnit.SECONDS)
|
|
.readTimeout(READ_TIME, TimeUnit.SECONDS)
|
|
.readTimeout(READ_TIME, TimeUnit.SECONDS)
|
|
- .writeTimeout(WRITE_TIME, TimeUnit.SECONDS)
|
|
|
|
- .hostnameVerifier(new HostnameVerifier() {
|
|
|
|
- @Override
|
|
|
|
- public boolean verify(String hostname, SSLSession session) {
|
|
|
|
- return true;
|
|
|
|
- }
|
|
|
|
- }).sslSocketFactory(sslSocketFactory, trustManager);
|
|
|
|
|
|
+ .writeTimeout(WRITE_TIME, TimeUnit.SECONDS);
|
|
|
|
+
|
|
|
|
+ //是否忽略host验证
|
|
|
|
+ if (ignoreHostnameVerifier) {
|
|
|
|
+ builder.hostnameVerifier(getHostnameVerifier());
|
|
|
|
+ }
|
|
|
|
+ builder.sslSocketFactory(sslSocketFactory, trustManager[0])
|
|
|
|
+ .retryOnConnectionFailure(true);
|
|
|
|
|
|
client = builder.build();
|
|
client = builder.build();
|
|
okHttpClientSslThreadLocal.set(client);
|
|
okHttpClientSslThreadLocal.set(client);
|
|
@@ -282,7 +313,7 @@ public class OkHttpUtils {
|
|
try {
|
|
try {
|
|
return okHttpClient(ssl).newCall(request).execute().body().string();
|
|
return okHttpClient(ssl).newCall(request).execute().body().string();
|
|
} catch (IOException e) {
|
|
} catch (IOException e) {
|
|
- logger.error("okhttp3 post throw IOException, {}", e.getMessage());
|
|
|
|
|
|
+ logger.error("okhttp3 post throw IOException, {}", e.getMessage());
|
|
}
|
|
}
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
@@ -293,7 +324,7 @@ public class OkHttpUtils {
|
|
* @param ssl
|
|
* @param ssl
|
|
* @param responseCallback
|
|
* @param responseCallback
|
|
*/
|
|
*/
|
|
- public static void asyncPostCallback(Request request, String ssl, Callback responseCallback) {
|
|
|
|
|
|
+ public static void asyncPostCallback(Request request, String ssl, Callback responseCallback) {
|
|
okHttpClient(ssl).newCall(request).enqueue(responseCallback);
|
|
okHttpClient(ssl).newCall(request).enqueue(responseCallback);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -318,41 +349,20 @@ public class OkHttpUtils {
|
|
|
|
|
|
|
|
|
|
//------------------------------ ssl ------------------------------
|
|
//------------------------------ ssl ------------------------------
|
|
|
|
+
|
|
/**
|
|
/**
|
|
- * 获取SSLSocketFactory
|
|
|
|
- *
|
|
|
|
- * @param certificates 证书流文件
|
|
|
|
|
|
+ * 获取主机验证 HostnameVerifier
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
- /*private static SSLSocketFactory buildSSLSocketFactory(InputStream... certificates) {
|
|
|
|
- try {
|
|
|
|
- CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
|
|
|
|
- KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
|
|
|
|
- keyStore.load(null);
|
|
|
|
- int index = 0;
|
|
|
|
- for (InputStream certificate : certificates) {
|
|
|
|
- String certificateAlias = Integer.toString(index++);
|
|
|
|
- keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));
|
|
|
|
-
|
|
|
|
- try {
|
|
|
|
- if (certificate != null) {
|
|
|
|
- certificate.close();
|
|
|
|
- }
|
|
|
|
- } catch (IOException e) {
|
|
|
|
- }
|
|
|
|
|
|
+ public static HostnameVerifier getHostnameVerifier() {
|
|
|
|
+ return new HostnameVerifier() {
|
|
|
|
+ @Override
|
|
|
|
+ public boolean verify(String s, SSLSession sslSession) {
|
|
|
|
+ return true;
|
|
}
|
|
}
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
|
|
- TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
|
|
|
|
- trustManagerFactory.init(keyStore);
|
|
|
|
-
|
|
|
|
- SSLContext sslContext = SSLContext.getInstance("TLS");
|
|
|
|
- sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
|
|
|
|
- return sslContext.getSocketFactory();
|
|
|
|
- } catch (Exception e) {
|
|
|
|
- e.printStackTrace();
|
|
|
|
- }
|
|
|
|
- return null;
|
|
|
|
- }*/
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
* 自定义证书
|
|
* 自定义证书
|
|
@@ -390,12 +400,44 @@ public class OkHttpUtils {
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
- private static X509TrustManager buildX509TrustManager(){
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 证书管理
|
|
|
|
+ * 信任所有证书
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private static X509TrustManager[] buildX509TrustManager(){
|
|
return buildX509TrustManager(null);
|
|
return buildX509TrustManager(null);
|
|
}
|
|
}
|
|
|
|
|
|
- private static X509TrustManager buildX509TrustManager(InputStream... certificates) {
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 证书管理
|
|
|
|
+ * 如果要信任所有证书,<code>InputStream... certificates</code>为null
|
|
|
|
+ * @param certificates 证书文件流
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private static X509TrustManager[] buildX509TrustManager(InputStream... certificates) {
|
|
try {
|
|
try {
|
|
|
|
+ if (certificates == null) {
|
|
|
|
+ // 信任所有证书
|
|
|
|
+ return new X509TrustManager[]{
|
|
|
|
+ new X509TrustManager() {
|
|
|
|
+ @Override
|
|
|
|
+ public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public X509Certificate[] getAcceptedIssuers() {
|
|
|
|
+ return new X509Certificate[]{};
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 信任自定义证书
|
|
KeyStore keyStore = generateKeyStore(certificates);
|
|
KeyStore keyStore = generateKeyStore(certificates);
|
|
|
|
|
|
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
|
|
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
|
|
@@ -409,8 +451,7 @@ public class OkHttpUtils {
|
|
+ Arrays.toString(trustManagers));
|
|
+ Arrays.toString(trustManagers));
|
|
}
|
|
}
|
|
|
|
|
|
- X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
|
|
|
|
- return trustManager;
|
|
|
|
|
|
+ return (X509TrustManager[]) trustManagers;
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
@@ -425,7 +466,7 @@ public class OkHttpUtils {
|
|
|
|
|
|
private static SSLSocketFactory buildSSLSocketFactory(InputStream... certificates) {
|
|
private static SSLSocketFactory buildSSLSocketFactory(InputStream... certificates) {
|
|
try {
|
|
try {
|
|
- TrustManager trustManager = buildX509TrustManager(certificates);
|
|
|
|
|
|
+ TrustManager[] trustManager = buildX509TrustManager(certificates);
|
|
return buildSSLSocketFactory(trustManager);
|
|
return buildSSLSocketFactory(trustManager);
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
@@ -433,23 +474,14 @@ public class OkHttpUtils {
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
|
|
|
|
- private static SSLSocketFactory buildSSLSocketFactory(TrustManager trustManager) {
|
|
|
|
|
|
+ private static SSLSocketFactory buildSSLSocketFactory(TrustManager[] trustManager) {
|
|
try {
|
|
try {
|
|
if (trustManager == null) {
|
|
if (trustManager == null) {
|
|
throw new IllegalStateException("TrustManager is null");
|
|
throw new IllegalStateException("TrustManager is null");
|
|
}
|
|
}
|
|
|
|
|
|
- SSLContext sslContext = SSLContext.getInstance("SSL");
|
|
|
|
- sslContext.init(null, new TrustManager[]{new X509TrustManager() {
|
|
|
|
- @Override
|
|
|
|
- public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {}
|
|
|
|
- @Override
|
|
|
|
- public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {}
|
|
|
|
- @Override
|
|
|
|
- public X509Certificate[] getAcceptedIssuers() {
|
|
|
|
- return new X509Certificate[0];
|
|
|
|
- }
|
|
|
|
- }}, new SecureRandom());
|
|
|
|
|
|
+ SSLContext sslContext = SSLContext.getInstance(SSL);
|
|
|
|
+ sslContext.init(null, trustManager, new SecureRandom());
|
|
|
|
|
|
return sslContext.getSocketFactory();
|
|
return sslContext.getSocketFactory();
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
@@ -459,4 +491,6 @@ public class OkHttpUtils {
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
+
|
|
}
|
|
}
|