
INTRO
웹/모바일 앱 진단 시 HTTPS 통신 패킷이 제대로 잡히지 않는 경우가 있습니다.
이는 서버 측에서 발급한 CA 인증서를 클라이언트(PC, 휴대폰 단말기)에서 검증하고 있기 때문인데요.
프록시 툴(Burp Suite, ZAP, Caido, Fiddler, etc.)을 이용할 때 HTTPS(SSL/TLS) 데이터를 제대로 확인하기 위해서는 프록시 서버에 대한 CA 인증서를 점검자의 PC/단말에 설치하는 과정이 필요합니다.
CA 인증서는 통신하려는 서버가 CA(Certificate Authority)에게 신원을 인증받았다는 사실을 증명하는 문서인데요. CA 인증서가 없다면 통신 대상의 검증 여부를 알 수 없어 신원 식별이 불가하기 때문에 OS에서는 통신을 허용하지 않습니다. 이러한 문제를 해결하기 위해서는 프록시 서버의 인증서나 SELF-SIGNED 인증서를 PC/단말기에 설치해야 합니다. 이번 포스팅에서는 버프스위트 인증서를 설치하는 방법과 OPENSSL로 직접 인증서를 만들어 설치하는 방법을 소개해보도록 하겠습니다.
버프스위트 인증서 설치
1. 시스템 인증서 설치 (OPENSSL)
- (1) 버프스위트에서 CA 인증서 다운로드
- (2) 다운로드 시 확장자는
.der로 추출

1-2. 인증서 확장자 변환 및 해시 값 추출
# 확장자 (der -> pem) 변경
openssl x509 -inform DER -in cacert.der -out cacert.pem
# 인증서 해시 추출
openssl x509 -inform PEM -subject_hash_old -in cacert.pem
1-3. 인증서(9a5ba575.0) 밀어넣기
- POWERSHELL
PS C:\Users\soneg> mv .\cacert.pem .\9a5ba575.0
PS C:\Users\soneg> adb push .\9a5ba575.0 /data/local/tmp
.\9a5ba575.0: 1 file pushed, 0 skipped. 1.6 MB/s (1348 bytes in 0.001s)- ANDROID SHELL
mount -o rw,remount /
cp /data/local/tmp/9a5ba575.0 /system/etc/security/cacerts
mount -o ro,remount /
/system/etc/security/cacerts 는 안드로이드 시스템에 내장된 신뢰할 수 있는 루트 CA 인증서들이 저장되는 경로입니다. 여기까지 정상적으로 진행이 됐다면, 버프스위트(프록시 서버)의 인증서가 Android 시스템이 기본적으로 신뢰하는 시스템 루트 CA 저장소에 등록이 된 것이므로 정상적으로 통신이 가능해집니다.
2. 시스템 인증서 설치 - Magisk Module (AlwaysTrustUserCerts)
버프스위트에서 CA 인증서를 추출한 뒤 단말기에서 설치하면 기본적으로 사용자 인증서로 설치되는데요. Android 7 (Nougat) 이후부터는 앱이 사용자가 추가한 CA(인증서)를 기본적으로 신뢰하지 않도록 변경되어 통신이 정상적으로 되게 하려면 네트워크 보안 설정(network_security_config.xml)을 변경하거나, 사용자 설치 CA가 아니라 시스템 루트 CA로 별도로 등록을 해줘야 합니다. 이전 과정처럼 /system/etc/security/cacerts 경로에 인증서를 직접 밀어넣어도 되지만, 이와 동일한 기능을 제공하는 매지스크의 모듈(AlwaysTrustUserCerts)이 존재합니다. (사용 방법은 다음과 같습니다.)
(1) 매지스크 모듈(AlwaysTrustUserCerts.zip) 다운로드
(2) 매지스크 → 모듈 → 저장소에 설치 → AlwaysTrustUserCerts.zip 선택

(3) 버프스위트 CA 인증서(EX; cacert.crt) 추출 및 재설치
(4) 단말기를 재부팅하면 설치한 사용자 인증서를 시스템 인증서 경로에서도 확인할 수 있습니다.
- (*이미지에는 가려졌지만 “시스템 인증서” 경로에 있습니다.)

번외 (SELF-SIGNED CERTIFICATE)
(1) OpenSSL로 자체 CA 인증서 생성하기
# 1. CA 개인키 생성 (2048비트)
openssl genrsa -out MyCA.key 2048
# 2. 자체 서명된 CA 인증서 생성 (유효기간 3650일)
# 실행 시 나오는 질문(국가, 조직 등)은 적당히 입력하거나 엔터를 치셔도 됩니다.
openssl req -x509 -new -nodes -key MyCA.key -sha256 -days 3650 -out MyCA.pem(2) Burp Suite에 생성한 인증서 등록
# Burp Suite가 내가 만든 인증서로 패킷을 복호화하도록 설정해야 합니다.
# PKCS12 형식으로 변환: (Burp 임포트용)
openssl pkcs12 -export -out MyCA.p12 -inkey MyCA.key -in MyCA.pem -name "MyCustomCA"
# 설정할 비밀번호를 기억하세요.
# [버프스위트 설정(Settings)]
# Proxy > Proxy Settings > Import / export CA certificate > Certificate and private key in PKCS12 format 선택
# MyCA.p12 파일을 임포트합니다.(3) 안드로이드용 해시 파일 생성
# 안드로이드 시스템이 인식할 수 있는 파일명으로 변환합니다.
# 1. 인증서의 Subject Hash 확인
PS C:\Users\soneg> HASH=$(openssl x509 -inform PEM -subject_hash_old -in MyCA.pem | head -1)
# 2. 해시값.0 이름으로 복사
PS C:\Users\soneg> cp MyCA.pem $HASH.0
# 3. 인증서 전송 및 권한 설정
PS C:\Users\soneg> adb push .\$HASH.0 /data/local/tmp$ mount -o rw,remount /
$ cp /data/local/tmp/9a5ba575.0 /system/etc/security/cacerts
$ mount -o ro,remount /
# 적용을 위한 재부팅
PS C:\Users\soneg> adb reboot