안녕하세요,
카카오엔터테인먼트에서 백엔드 개발을 하고 있는 Andy입니다.
오늘 제가 공유드릴 주제는 'https 프록시로 mitmproxy를 써보자.'인데요~
mitmproxy가 사용해보니 너무 좋아서 다른 분들도 많이 활용해보시길 바라는 마음으로 시작해보겠습니다.
http 프록시로 익숙한 찰스를 써보려고 했지만, 구매가 까다롭다고 하여 요 녀석(mitmproxy)을 써보기로 했습니다.
📍 준비물
안드로이드 스튜디오, 안드로이드 SDK
💬 준비물들은 안드로이드 가상 디바이스를 만들기 위해서 필요합니다.
가상 디바이스를 만들고 나서 앱을 빌드한 다음부터는 emualtor 명령어로 켜면 됩니다.
⚠️ 주의
안드로이드 가상 디바이스를 만들 때는 play store 딱지가 없는 녀석으로 해야 proxy설정이 가능합니다.
SDK타겟을 8이하로 해도 된다고 합니다.
📍 mitmproxy 사용해보기
◾️ mitmproxy란?
mitmproxy는 charles proxy와 비슷한 오픈소스 HTTP/HTTPS Proxy입니다.
◾️ 왜 사용할까?
mitmproxy는 오픈소스입니다. 그리고... 무엇보다 무료입니다..(👀) 여러 환경에서 설치도 간단합니다.
또한 파이썬을 조금만 할 줄 안다면 다양한 기능들을 파이썬 스크립트로 구현하여 사용할 수 있습니다.
◾️ 작업 순서
1. 설치
2. 프록시 서버 실행
- 둘다 옵션 '-p 포트번호'를 사용할 수 있습니다. 기본값은 '8080'.
- mitmweb의 경우, 옵션 '--web-port'를 사용할 수 있습니다. 기본값은 '8081'.
- 인증서 오류 발생 시 '--ssl-insecure' 옵션을 사용해봅시다. ('mitmweb --ssl-insecure')
3. 기기의 와이파이 설정에서 프록시 설정
❕ 띄워놓은 프록시 서버와 동일한 네트워크여야 합니다.
- iOS : 설정 앱 > Wi-Fi > 연결된 네트워크의 SSID 오른쪽 i 버튼 > 프록시 구성 > '수동' 체크하고 아래와 같이 채움
- Android : Wi-Fi > 접속한 와이파이명에서 길게 터치 > 네트워크 설정 관리 > 프록시 구성 > '수동' 체크하고 아래와 같이 채움
- Mac : 시스템 환경설정 > 네트워크 > (연결된 network) 고급 > 프록시 > 웹 프록시(HTTP)와 보안 웹 프록시(HTTPS)의 서버정보(IP, Port) 설정 > 확인 > 적용
4. 정상적인 HTTPS 통신을 위해 인증서 설정
- iOS
: safari 앱을 열고 `mitm.it`로 접속 > 애플 버튼을 눌러 인증서 설치 > 홈으로 나와 아래 진행
: 설정 앱 > 일반 > 정보 > 인증서 신뢰 설정 > 'mitmproxy on'
- Android
: chrome 앱 열고 'mitm.it'로 접속 > 안드로이드 버튼 눌러서 인증서 설치 > 아무 이름이나 입력 후 저장 > 완료
- Mac
: 'mitm.it'로 접속 > 'Apple' 버튼을 눌러 다운로드 > 실행해서 추가
: 키체인 접근 > mitmproxy 더블클릭 > 신뢰 > 이 인증서 사용 시 "항상 신뢰"로 변경 후 닫기 > 암호입력
❕ HSTS가 적용된 사이트(google, github...)는 접근 불가
5. 정상적으로 동작하는지 확인
❕다음 등의 사이트가 정상적으로 동작하는지 확인합니다.
📍 안드로이드 에뮬레이터에 proxy 설정하기
◾️ 안드 에뮬레이터에서 설정 (번거로우니 안 하는 게 좋을 듯)
◾️ Network details → 연필 아이콘 클릭 → Advanced Options → Proxy → ip와 port 설정 후 저장
◾️ 에뮬레이터가 실행 중 일 때 adb로 세팅할 수 있음. (📝 여기 참고 )
◾️ 프록시 설정 해제
📍 mitm 인증서 설치
굉장히 귀찮고 주의할 점이 많으니 차근차근 진행합시다. 👀
1. 안드로이드 SDK의 emulator, adb 명령어를 사용할 수 있게 패스에 추가합니다.
저는 아래와 같이 진행했습니다.
일단 에뮬레이터 시작 시 -writable-system 옵션을 꼭 넣어줘야 합니다. 그리고 adb root 명령을 사용할 수 있어야 하는데, 위에서 안드로이드 가상 디바이스를 만들 때 play store 딱지가 있으면 adb root를 사용할 수 없으니 주의!
2. 인증서 이름을 바꿉니다.
mitmproxy를 설치하면 ~/.mitmproxy 디렉토리 아래에 가짜 인증서가 들어 있습니다.
아래 명령을 실행해서 인증서를 카피하면 c8750f0d.0 같은 이름의 파일이 생깁니다.
3. 인증서를 안드로이드 디바이스에 넣습니다.
순서대로 아래와 같이 실행해줍니다.
- AVD의 리스트를 확인하자 : emulator -list-avds (없으면 AVD 매니저에서 만들어야 함)
- 인증서를 복사할 AVD를 시작하자: emulator -avd <avd_name> -writable-system (-show-kernel 커널로그 보기)
- abd를 root계정으로 재시작 : adb root
- 보안 부팅 비활성화: adb shell avbctl disable-verification
- 디바이스 재부팅 : adb reboot
- adb root 계정으로 재시작 : adb root
- adb리마운트 : adb remount
- 2단계에서 만든 인증서를 카피하자 : adb push <인증서 경로> /system/etc/security/cacerts
- 인증서 권한 설정 : adb shell chmod 664 /system/etc/security/cacerts/<인증서 파일명>
- 디바이스 재시작 : adb reboot
여기까지 하면 mitmproxy로 로그가 남습니다.
📍 유용한 단축키
F(대문자) : 프록시로 중간에 가로챈 요청을 자동으로 위로 올라가게 합니다. 기본 옵션은 off여서 F를 눌러주면 동작합니다.
스페이스 : Flow의 커서가 중간에 있을 때, 다음 페이지로 가는 키가 여러 개 있는데 스페이스를 치면 바로 다음 페이지로 이동합니다. (기본 페이징 사이즈는 30)
여기까지 제가 준비한 내용입니다.
이 글을 읽어주시는 분들에게 유용한 정보이길 바랍니다.
감사합니다.
'Tech' 카테고리의 다른 글
HTTP/2 훑어보고 AWS에 적용해보기 (0) | 2022.05.31 |
---|---|
GitHub Actions에서 도커 캐시를 적용해 이미지 빌드하기 (0) | 2022.05.31 |
Test Code Why? What? How? (0) | 2022.05.17 |
카카오웹툰은 GitHub Actions를 어떻게 사용하고 있을까? (0) | 2022.03.23 |
프론트엔드와 THE TWELVE-FACTOR APP (0) | 2022.03.07 |