본문 바로가기

푸로그래밍/JAVA

[JAVA, Kotlin] OkHttp3 인증서 신뢰

반응형

 문제가 생겼다.

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인증서를 적용했으나, 네이버에서 출시한지 얼마 안된 따끈따끈한 서비스여서 여러 브라우저 및 기기나 운영체제에서 해당 서명자를 신뢰할 수 없어서 나는 에러였다. 사실 이런 경우에는

  1. 운영체제단에서 이 인증서를 "신뢰" 해주거나
  2. 해당 인증서만을 "신뢰"해서 return true하는 코드를 작성해야 하거나
  3. 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()
반응형