Android Framework의 SSL 라이브러리 분석
1. 개요
SSL(Secure Sockets Layer) 및 TLS(Transport Layer Security)는 인터넷에서 데이터를 안전하게 전송하기 위한 필수적인 프로토콜입니다. Android에서도 다양한 네트워크 통신에서 SSL/TLS를 활용하며, 이를 위해 여러 개의 SSL 라이브러리를 포함하고 있습니다. 본 글에서는 Android에서 사용되는 SSL 라이브러리를 분석하고, AOSP(Android Open Source Project)에서 이를 어떻게 구현하는지 살펴보겠습니다.
2. Android에서 사용되는 SSL 라이브러리
Android는 보안성을 위해 기본적으로 여러 SSL 라이브러리를 사용합니다. 대표적인 라이브러리는 다음과 같습니다.
- BoringSSL: Google이 OpenSSL을 기반으로 개선한 경량 SSL/TLS 라이브러리
- OpenSSL: 일부 Android 버전에서 사용된 오픈소스 SSL/TLS 라이브러리
- Conscrypt: Java 기반의 TLS 라이브러리로, Android Security Provider에서 활용
이제 각각의 라이브러리에 대해 자세히 살펴보겠습니다.
2.1 BoringSSL
BoringSSL은 OpenSSL에서 파생된 라이브러리로, Google이 Chrome 및 Android에서 사용하기 위해 개발하였습니다. AOSP에서는 external/boringssl
디렉터리에 소스 코드가 위치합니다.
AOSP_ROOT/external/boringssl/
BoringSSL은 OpenSSL과의 호환성을 일부 유지하면서도 불필요한 기능을 제거하여 성능과 보안성을 강화한 것이 특징입니다.
2.2 OpenSSL
Android 6.0(Marshmallow) 이전에는 OpenSSL이 사용되었으며, 이후 BoringSSL로 대체되었습니다. OpenSSL은 external/openssl
디렉터리에 존재하며, OpenSSL의 일부 기능이 여전히 AOSP 내에서 사용됩니다.
AOSP_ROOT/external/openssl/
2.3 Conscrypt
Conscrypt는 Java 기반의 TLS 라이브러리로, Android Security Provider에서 기본적으로 제공됩니다. 이는 libcore
의 일부로 포함되어 있으며, 네트워크 통신 시 신뢰할 수 있는 TLS 구현을 제공합니다.
AOSP_ROOT/libcore/ojluni/src/main/java/sun/security/ssl/
3. AOSP에서 SSL 동작 방식
Android에서 SSL/TLS가 어떻게 동작하는지 살펴보겠습니다.
3.1 네트워크 스택 개요
Android의 네트워크 통신 과정에서 SSL/TLS가 적용되는 주요 구성 요소는 다음과 같습니다.
- Network Security Config: 애플리케이션별로 TLS 설정을 정의
- Java Secure Socket API:
SSLSocket
,SSLServerSocket
등을 제공 - Native SSL Library: BoringSSL 및 Conscrypt
- Certificate Validation: 시스템이 제공하는 CA 인증서 검증
3.2 SSL 소켓 생성 과정
SSL 통신을 위한 소켓을 생성하는 기본적인 과정은 다음과 같습니다.
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, null, new SecureRandom());
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
SSLSocket sslSocket = (SSLSocket) socketFactory.createSocket("example.com", 443);
sslSocket.startHandshake();
위 코드에서 SSLContext
를 통해 TLS를 설정하고, SSLSocket
을 이용하여 핸드셰이크를 수행하는 과정을 확인할 수 있습니다.
3.3 AOSP 내부 코드 분석
AOSP에서 SSL/TLS가 어떻게 구현되어 있는지 살펴보겠습니다.
libcore
의 Conscrypt
Conscrypt의 주요 코드는 libcore
모듈 내에 포함되어 있으며, Java의 SSL 구현을 담당합니다.
// libcore/luni/src/main/java/org/conscrypt/ConscryptEngine.java
public final class ConscryptEngine extends SSLEngine {
@Override
public void beginHandshake() throws SSLException {
synchronized (handshakeLock) {
if (handshakeState != HandshakeState.NOT_STARTED) {
throw new IllegalStateException("Handshake already started");
}
handshakeState = HandshakeState.STARTED;
// 실제 TLS 핸드셰이크 수행
engine.beginHandshake();
}
}
}
위 코드를 통해 SSLEngine
의 TLS 핸드셰이크 과정을 확인할 수 있습니다.
BoringSSL
의 네이티브 코드
BoringSSL의 네이티브 코드 구현을 살펴보겠습니다.
// external/boringssl/ssl/ssl_lib.c
int SSL_do_handshake(SSL *ssl) {
if (ssl->handshake_func == NULL) {
OPENSSL_PUT_ERROR(SSL, SSL_R_UNINITIALIZED);
return -1;
}
return ssl->handshake_func(ssl);
}
핸드셰이크 함수 SSL_do_handshake()
를 통해 실제 SSL 핸드셰이크가 진행되는 것을 확인할 수 있습니다.
4. SSL 인증서 검증 과정
SSL 인증서 검증은 보안상의 중요한 요소입니다. Android에서는 기본적으로 시스템에 저장된 신뢰할 수 있는 CA 목록을 사용하여 인증서를 검증합니다.
4.1 CA 인증서 저장소
Android의 기본 CA 인증서 목록은 /system/etc/security/cacerts
디렉터리에 저장되며, Java에서 TrustManager
를 사용하여 검증을 수행합니다.
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore) null);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
5. 결론
Android에서 SSL/TLS는 BoringSSL과 Conscrypt를 기반으로 동작하며, 네이티브 및 Java 계층에서 구현됩니다. AOSP의 코드를 통해 SSL 핸드셰이크, 소켓 생성, 인증서 검증 등의 과정을 확인할 수 있으며, 보안성을 높이기 위해 지속적으로 개선되고 있습니다. 본 분석을 통해 Android SSL 라이브러리의 내부 동작을 이해하고, 필요 시 보안 강화 및 성능 최적화에 적용할 수 있을 것입니다.
'Android > Framework' 카테고리의 다른 글
Android NDK(Native Development Kit) 개요 및 활용 (0) | 2025.04.05 |
---|---|
JNI(Java Native Interface) 개념 및 사용법 (0) | 2025.04.04 |
Android WebKit 라이브러리 분석 (0) | 2025.04.02 |
Android Framework의 SQLite 라이브러리 분석 (0) | 2025.04.01 |
Android OpenGL 라이브러리 분석 (0) | 2025.03.31 |