반응형
문제가 생겼다.
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed:
인증서 악수에 실패했다고 한다.
Java환경에서 OKHttp3를 사용할 때 여러가지 사유로 인하여 인증서를 신뢰시켜줘야 하는 경우가 있다. 해당 경우에 사용할 수 있는 전체 인증서에 대해서 true를 줘버리는 무지막지한 코드이다.
Kotlin에 대해서는 맨 마지막에 작성하였다.
// x509 "신뢰" 관리자 선언 및 implement
X509TrustManager x509 = new 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[]{};
}
};
// 등록할 "신뢰" 관리자 배열 생성 후 추가
TrustManager[] trustAllCerts = new TrustManager[]{x509};
// Java의 SSLContext 획득 및 위에 선언한 "신뢰" 관리자 배열을 등록
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new SecureRandom());
// OkHttoClient 생성시 SSO 소켓 공장 및 "신뢰" 관리자 등록
OkHttpClient client = new OkHttpClient.Builder()
.sslSocketFactory(sslContext.getSocketFactory(), x509)
.build();
필자의 경우 Naver cloud platform의 certificate manager에서 제공하는 SSL인증서를 적용했으나, 네이버에서 출시한지 얼마 안된 따끈따끈한 서비스여서 여러 브라우저 및 기기나 운영체제에서 해당 서명자를 신뢰할 수 없어서 나는 에러였다. 사실 이런 경우에는
- 운영체제단에서 이 인증서를 "신뢰" 해주거나
- 해당 인증서만을 "신뢰"해서 return true하는 코드를 작성해야 하거나
- keytool을 이용해서 이 인증서를 "신뢰"
하는 것이 맞으나, 필자는 2024년 연봉이 동결되었으므로 그냥 전체"신뢰" 시켜버렸다.
아래는 kotlin환경에서의 신뢰 코드이다.
// x509 "신뢰" 관리자 선언 및 implement
val x509: X509TrustManager = object : X509TrustManager {
@Throws(CertificateException::class)
override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {
}
@Throws(CertificateException::class)
override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {
}
override fun getAcceptedIssuers(): Array<X509Certificate> {
return arrayOf()
}
}
// 등록할 "신뢰" 관리자 배열 생성 후 추가
val trustAllCerts = arrayOf<TrustManager>(x509)
// Java의 SSLContext 획득 및 위에 선언한 "신뢰" 관리자 배열을 등록
val sslContext = SSLContext.getInstance("SSL")
sslContext.init(null, trustAllCerts, SecureRandom())
// OkHttoClient 생성시 SSO 소켓 공장 및 "신뢰" 관리자 등록
val client: OkHttpClient = OkHttpClient.Builder()
.sslSocketFactory(sslContext.socketFactory, x509)
.build()
반응형
'푸로그래밍 > JAVA' 카테고리의 다른 글
[JAVA] File MD5 checksum (0) | 2023.12.21 |
---|---|
[JAVA] 정규표현식 사용 방법 - 2 (Pattern, Matcher) (0) | 2021.03.26 |
[JAVA] 정규표현식 사용 방법 - 1 (String.match, String.replaceAll, String.replaceFirst, String.split) (0) | 2021.03.26 |