์ด ์˜ค๋ฅ˜๋Š” Android 10(API 29) ์ด์ƒ์—์„œ OkHttp์˜ sslSocketFactory ์„ค์ •์ด ์ž˜๋ชป๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ฃผ๋œ ์›์ธ์€ TrustManager๋ฅผ ์ง์ ‘ ์„ค์ •ํ•˜์ง€ ์•Š์•„์„œ OkHttp๊ฐ€ ๊ธฐ๋ณธ SSL/TLS ๊ตฌ์„ฑ์„ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๐Ÿ”น 1๏ธโƒฃ ์˜ค๋ฅ˜ ์›์ธ ๋ถ„์„

java.lang.IllegalStateException: Unable to extract the trust manager on Android10Platform,
sslSocketFactory is class com.android.org.conscrypt.OpenSSLSocketFactoryImpl

๐Ÿ“Œ ์ฃผ์š” ์›์ธ

  1. OkHttp์˜ sslSocketFactory() ์‚ฌ์šฉ ์‹œ TrustManager๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ œ๊ณตํ•˜์ง€ ์•Š์Œ
  2. Android 10(API 29) ์ด์ƒ์—์„œ๋Š” TrustManager๋ฅผ ์ง์ ‘ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์ด ์ œํ•œ๋จ
  3. ์ž˜๋ชป๋œ SSLSocketFactory๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ OkHttp๊ฐ€ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๋ ค ํ•จ

โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• โ†’ TrustManager๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ•˜์—ฌ OkHttpClient๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”น 2๏ธโƒฃ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: OkHttp์— ์˜ฌ๋ฐ”๋ฅธ SSLSocketFactory ๋ฐ TrustManager ์„ค์ •ํ•˜๊ธฐ

OkHttp์—์„œ sslSocketFactory()๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ๋ช…ํ™•ํ•œ TrustManager๋ฅผ ํ•จ๊ป˜ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 1: ์˜ฌ๋ฐ”๋ฅธ TrustManager ๋ฐ SSLSocketFactory ์„ค์ •

java
๋ณต์‚ฌํŽธ์ง‘
import okhttp3.OkHttpClient;
import javax.net.ssl.*;

public class OkHttpHelper {
    public static OkHttpClient getSecureClient() {
        try {
            // 1. ๊ธฐ๋ณธ TrustManagerFactory ์ƒ์„ฑ
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init((KeyStore) null);
            TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();

            // 2. TrustManager๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ
            if (trustManagers.length == 0 || !(trustManagers[0] instanceof X509TrustManager)) {
                throw new IllegalStateException("Unexpected default trust managers:" + trustManagers);
            }

            X509TrustManager trustManager = (X509TrustManager) trustManagers[0];

            // 3. TLS ๊ธฐ๋ฐ˜ SSLContext ์ƒ์„ฑ
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, trustManagers, null);
            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            // 4. OkHttpClient์— ์˜ฌ๋ฐ”๋ฅธ TrustManager์™€ ํ•จ๊ป˜ ์„ค์ •
            return new OkHttpClient.Builder()
                    .sslSocketFactory(sslSocketFactory, trustManager)
                    .build();

        } catch (Exception e) {
            throw new RuntimeException("Failed to create secure OkHttpClient", e);
        }
    }
}

โœ… ์„ค๋ช