最近在完成GitHub接口登录的时候,在完成GitHub API文档的阅读后,我就开始了我的制作,我的redirect_uri都是没有问题的,但是程序却没有返回到页面并且报出了这么一个错误javax.net.ssl.SSLHandshakeException。经过我一顿捣鼓后,还是幸运的暂时解决了这个问题,为什么说是暂时呢,因为据我所知解决这个报错的方法有两个
- 下载网页证书
- 使用程序暂时跳过证书验证
我这里就不介绍下载证书了,因为我用这个方法没有解决我的问题.....
我用的是okhttp,所以下面我给出okhttp的第三方跳过证书验证
package com.tencent.wemeet.gateway.restapisdk.util;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import javax.net.ssl.*;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
/**
@Slf4j
public class SSLSocketClient {
public static OkHttpClient getUnsafeOkHttpClient() {
try {
// 创建不验证证书链的信任管理器
final TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};
if (trustAllCerts.length != 1 || !(trustAllCerts[0] instanceof X509TrustManager)) {
throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustAllCerts));
}
X509TrustManager x509TrustManager = (X509TrustManager) trustAllCerts[0];
// 安装全信任信任管理器
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
// 使用我们完全信任的管理器创建 ssl 套接字工厂
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.connectTimeout(60 , TimeUnit.SECONDS).readTimeout(60 , TimeUnit.SECONDS).writeTimeout(120 , TimeUnit.SECONDS);
builder.sslSocketFactory(sslSocketFactory , x509TrustManager);
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
OkHttpClient okHttpClient = builder.build();
return okHttpClient;
} catch (Exception e) {
log.error("创建OkHttpClient不进行SSL(证书)验证失败:{}", e.getMessage());
throw new RuntimeException(e);
}
}
}
最后用的方式替换创建okhttpClient的方式即可
private static final OkHttpClient okHttpClient = SSLSocketClient.getUnsafeOkHttpClient();