IT/Android

[OKHttp3] java.lang.NullPointerException: Attempt to get length of null array / BasicTrustRootIndex 관련 에러 처리

토마토조아 2018. 11. 29. 11:46
728x90

오늘은 OKHttp3 에서 발생하는 에러 처리를 다루어 보겠다.

OKHttp3에서 원활한 https 를 접속하기 위해서 대부분 인증서를 무시하는 코드를 함께 넣어서 client 를 빌드해서 사용하는 경우가 많다.

그 때 흔하게 발생하는 에러 중 하나는 아래의 에러이다.

java.lang.NullPointerException: Attempt to get length of null array,

BasicTrustRootIndex 관련 메세지들..


위의 에러는 주로 아래 코드가 문제가 된다. 아래의 getAcceptedIssuers() 의 return null; 이 부분이 문제.

/**
* UnCertificated 허용
*/
public static OkHttpClient.Builder configureClient(final OkHttpClient.Builder builder) {
final TrustManager[] certs = new TrustManager[]{new X509TrustManager() {

@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}

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

@Override
public void checkClientTrusted(final X509Certificate[] chain,
final String authType) {
}
}};

SSLContext ctx = null;
try {
ctx = SSLContext.getInstance("TLS");
ctx.init(null, certs, new SecureRandom());
} catch (final java.security.GeneralSecurityException ex) {
ex.printStackTrace();
}

try {
final HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(final String hostname, final SSLSession session) {
return true;
}
};

builder.sslSocketFactory(ctx.getSocketFactory()).hostnameVerifier(hostnameVerifier);

} catch (final Exception e) {
e.printStackTrace();
}

return builder;
}


위의 문제가 되는 부분의 소스를 아래와 같이 수정한다.

@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}


위와 같이 수정해서 client를 빌드해서 사용하면 문제가 발생하지 않는다.


참고한 곳 : https://github.com/square/okhttp/issues/2364

728x90