자체 인증서 설치가 허용되지 않는 Android 기기에서 앱 디버깅 중에 Charles에서 HTTPS 트래픽 분석을 수행하는 방법

앱을 디버깅 할 때 Charles에서 HTTPS 트래픽을 구문 분석하고 싶지만 인증서를 넣을 수없는 문제



안드로이드 앱을 만드는 데 있어서, Charles 에 의한 HTTPS의 트래픽 해석에 큰 도움이 되고 있다고 생각합니다.

이제 Charles에서 HTTPS 트래픽을 구문 분석하려면 Charles가 발급한 자체 인증서를 Android 인증서 저장소에 등록해야 하지만 일부 Android 기기(예: 일부 AndroidTV)에서는 인증서 저장소 에 자체 인증서를 설치할 수 없는 경우도 있습니다.

Android 7.0 이상 한정의 방법이 됩니다만, 그러한 Android 기기에서도 앱 디버그시에 Charles로 HTTPS를 해석할 수 있도록 하는 방법을 발견했기 때문에 적습니다.

기법 개요



Android 7.0부터 네트워크 보안 사양이 변경되어 매니페스트에서 명시적으로 트러스트 스토어를 지정하게 되었습니다.

이 기능을 활용하여 '디버그 버전 앱에 RAW 리소스로 포함된 Charles가 발급한 자체 인증서를 신뢰합니다'라는 설정을 넣으면 디버깅 시에만 Charles에서 HTTPS 트래픽을 탐색할 수 있습니다.

구체적인 기법



(1) Charles의 인증서를 디버깅 할 때만 앱에 포함



먼저 Build Variants를 활용하여 디버그 빌드 버전 앱 리소스에만 Charles의 인증서를 포함합니다.

Charles를 시작하고 메뉴에서 [Help] > [SSL Proxying] > [Save Charles Root Certificate]를 선택하고 Charles 인증서(PEM 형식)를 원하는 곳에 저장합니다.

그런 다음 Android Studio의 다음 경로에 PEM ​​파일을 설치하여 Raw 리소스로 Debug 빌드에만 포함합니다.
※Raw 자원에는 파일명의 제한이 있기 때문에, 앞의 순서로 보존한 PEM 파일의 확장자등을 제거해 「charles_ca_pem」이라고 하는 이름으로 해, raw 디렉토리내에 이동할 뿐입니다.

debug/res/raw/charles_ca_pem


(2) 임베디드 인증서를 디버깅 할 때 참조하고 신뢰할 수있는 설정을 넣습니다.


<network-security-config><debug-overrides> 을 이용하는 것으로, 디버그시만 포함한 독자 증명서를 참조 & 신뢰한다고 하는 설정을 실시할 수 있습니다.
이 설정은 디버그 시에만 유효하며, 또한 Play 스토어에는 디버깅 가능한 앱은 공개할 수 없기 때문에 프로덕션 릴리스 버전 앱으로 의도하지 않고 Charles에서 HTTPS 트래픽이 들여다 버리는 사태를 방지할 수 있습니다.

debug Build Variants에서 다음과 같이 작성하면 RAW 리소스의 인증서를 참조하고 신뢰할 수있는 인증서로 신뢰 앵커에 추가 할 수 있습니다.

debug/res/xml/network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <debug-overrides>
        <trust-anchors>
            <certificates src="@raw/charles_ca_pem"/>
        </trust-anchors>
    </debug-overrides>
</network-security-config>

스토어 공개판의 main 변형의 network_security_config는 우선 하늘로 만들어 둡니다.
main/res/xml/network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
</network-security-config>

그런 다음 AndroidManifest.xml에서 이러한 network_security_config.xml을 참조하면 인증서 신뢰 설정이이 앱에서 활성화됩니다.
<application
    android:name=".MyApp"
    android:networkSecurityConfig="@xml/network_security_config"
    >
    ...
</application>


앱 측에서의 준비는 이것뿐입니다.

그리고 Android 프록시 설정 화면에서 Charles를 사용하면 Charles에서 앱의 HTTPS 트래픽을 볼 수 있다고 생각합니다.

좋은 웹페이지 즐겨찾기