Android 7 Nougat에서 Charles Proxy를 사용하는 방법은 무엇입니까?


101

Android 7은 인증서 처리 방식 ( http://android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html )에 몇 가지 변경 사항을 도입 했으며 어떻게 든 내 Charles 프록시가 더 이상 작동하도록 만들 수 없습니다.

내 network_security_config.xml :

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
    <debug-overrides>
        <trust-anchors>
            <certificates src="user" />
        </trust-anchors>
    </debug-overrides>
</network-security-config>

디버그 모드에서 실행 중입니다. 그러나 어쨌든 나는 javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found..

말할 필요도없이에서 pfx인증서를 설치했습니다 Settings -> Security -> Install from storage. 인증서는에 표시 User Credentials되지만에는 표시 되지 않습니다 Trusted credentials -> User. 내 롤리팝 장치에 인증서가 나열됩니다.

okhttp3를 HTTP 라이브러리로 사용하고 있습니다.

내가 뭘 잘못하고 있는지 아십니까?


1
빠른 테스트 user로 하나를에 추가 / 이동하고 <base-config>변경 사항이 중요한지 확인하십시오. 그렇게해서는 안되지만 시도하는 데 시간이 걸립니다.
CommonsWare

developer.android.com/training/articles/security-config.html 에서 Charles에 대한 명시적인 CA를 추가 할 필요가 없습니까? Charles CA는 자체 생성 된 CA이므로 Android 시스템 신뢰 체인?
Morrison Chang

@Morisson Chang : Charles CA를 앱에 삽입하고 싶지 않습니다. 예전처럼 개발 전화에 수동으로 추가 할 수 있기를 바랍니다. FromSettings -> Security -> Install from storage
mbonnin

1. 앱의 AndroidManifest.xml에서 network_security_config.xml을 어떻게 참조하고 있습니까? 2. .pfx 파일을 연결 하시겠습니까? CA 인증서 (개인 키 없음) 만 포함되어 있으므로 게시하는 것이 좋습니다. .pfx에 개인 키가 포함되어 있으면 클라이언트 인증서 파일로 간주되어 파일의 CA가 서버 인증을 위해 신뢰할 수있는 것으로 설치되지 않기 때문에 묻습니다.
Alex Klyubin

1
@AlexKlyubin hurra, 지금 작동 중입니다 :). 내 찰스 나 앱을 재부팅해야했던 것 같아요. 누가 이전에 수많은 안드로이드 장치에 동일한 .pfx 파일을 설치했기 때문에 혼란 스러웠습니다. 그러나 지금은 모든 것이 좋습니다. 제가 승인 할 수 있도록 답변을 작성해 주시겠습니까?
mbonnin

답변:


26

OP에 대한 주석 문제 해결 스레드를 기반으로, 대답은 인증서 + 개인 키가 아닌 프록시의 CA 인증서 만 신뢰할 수있는 것으로 설치하는 것입니다.

이 문제는 다음 두 가지 요인으로 인해 발생했습니다.

  1. MiTM 프록시의 CA 인증서뿐만 아니라 개인 키도 설치합니다 (따라서 장치의 VPN 앱이 다른 앱의 MiTM 네트워크 트래픽을 해독 할 수 있음). 장치에 MiTM 프록시의 개인 키가 필요하지 않습니다.

  2. Settings -> Security -> Install from storage인증서 외에 비공개 키를 포함하는 파일 의 흐름 동작에 대한 Android Nougat 변경 사항입니다 . 이러한 행동 변화로 인해 위의 문제가 해결되었습니다.

Nougat 이전에는 Settings -> Security -> Install from storage인증서 외에 개인 키를 포함하는 파일 의 흐름이 인증서를 서버 인증에 대해 신뢰할 수있는 것으로 잘못 설치했습니다 (예 : HTTPS, TLS, 따라서 MiTM이 성공하도록 함). 이 Android 장치를 서버에 인증합니다. Nougat에서 버그가 수정되었으며 이러한 인증서는 더 이상 서버 인증을 위해 신뢰할 수있는 것으로 설치되지 않습니다. 이렇게하면 클라이언트 인증 자격 증명이 서버 연결 보안에 영향을주는 (약한) 것을 방지 할 수 있습니다. 귀하의 시나리오에서 이로 인해 MiTM이 성공하지 못합니다.

문제가되는 것은 Settings -> Security -> Install from storage사용자가 클라이언트 인증 자격 증명 (개인 키 + 인증서 체인) 또는 서버 인증 신뢰 앵커 (CA 인증서 만-개인 키 필요 없음)를 설치하는지 여부를 지정하는 명시적인 방법을 사용자에게 제공하지 않는다는 것입니다. . 결과적으로 Settings -> Security -> Install from storage흐름은 개인 키가 지정된 경우 클라이언트 / 사용자 인증 자격 증명이어야한다고 가정하여 클라이언트 / 사용자 인증 자격 증명 또는 서버 인증 신뢰 앵커를 처리하는지 여부를 추측합니다. 귀하의 경우 서버 인증 신뢰 앵커가 아닌 클라이언트 / 사용자 인증 자격 증명을 설치한다고 잘못 가정했습니다.

PS 네트워크 보안 구성과 관련하여 디버그 모드에서 "시스템"트러스트 앵커도 신뢰하도록 앱을 구성해야합니다 (디버그 재정의 섹션). 그렇지 않으면 CA 인증서가 Android 장치에서 신뢰할 수있는 것으로 설치된 프록시에 의해 연결이 MiTM되지 않는 한 앱의 디버그 빌드가 작동하지 않습니다.


1
PS : 문서에 Trust anchors specified in debug-overrides are added to all other configurations. 그래서 나는 그것이 'base-config'에 추가되고 완전히 대체되지 않았다는 인상을 받았습니다.
mbonnin

오, 맞아요. 디버그 재정의에 "시스템"트러스트 앵커를 명시 적으로 나열 할 필요가 없습니다.
Alex Klyubin

4
이 대답은 불분명합니다. 아래 @stkent의 답변을 참조하십시오.
Adam Hurwitz

4
이 답변은 무슨 일이 일어나고 있는지 설명하지만 어떤 단계를 수행해야하는지 명확하지 않습니다.
StarWind0

114

해결책은 .p12를 사용하지 않고 Chrome (wifi에 구성된 프록시 포함)으로 이동하여 http://charlesproxy.com/getssl로 이동 하고 다운로드 한 .pem 파일을 설치하는 것 입니다.

Android 7.0을 실행하는 Nexus 5X에서 똑같은 문제가 발생했습니다. 이전에는 Charles 3.11.5에서 .p12를 내보냈습니다 (도움말-> SSL 프록시-> Charles 루트 인증서 및 개인 키 내보내기). 전화 (설정-> 보안-> 저장소에서 설치)에서 .p12를 설치하려고 할 때 "사용자 자격 증명"에만 표시되고 "신뢰할 수있는 자격 증명"에는 표시되지 않으며 당연히 Charles 프록시를 사용하는 SSL이 작동하지 않았습니다.

Android 7.0의 전체 "방법"은 다음과 같습니다.

  1. WiFi + 프록시를 구성합니다 (Charles가 요구하는 방식). 연결하십시오.
  2. 기기에서 Chrome을 사용하여 http://charlesproxy.com/getssl로 이동하고 .pem 다운로드 요청을 수락 한 다음 "열기"를 누르면 "인증서 설치 프로그램"앱이 실행됩니다. 이를 사용하여 인증서를 "VPN 및 앱"으로 설치하십시오.
  3. Manifest.xml에 속성 android:networkSecurityConfig="@xml/network_security_config"을 넣으십시오.<application>
  4. 첫 번째 게시물의 내용으로 res / xml / network_security_config.xml을 만듭니다 (완전히 정확합니다).
  5. Charles와 앱을 실행하고 재미있게 보내세요.

PS 장치의 날짜 / 시간을 확인합니다. 정확해야합니다.


2
이 훌륭한 답변에 대한 중요한 참고 사항 : 앱이 API 23 이하를 대상으로하는 경우 3 단계와 4 단계가 필요하지 않습니다. 실제로 API 23이있는 경우 network-security-config 항목을 컴파일 할 수 없습니다. 이하.
David Ferrand

1
이것은 Android 7.0을위한 훌륭한 솔루션입니다. 공식 Charles Proxy 정보보다 훨씬 명확합니다.
Adam Link

3
나에게만 해당 될 가능성이 있지만이 단계는 7.1.1에서 더 이상 작동하지 않습니다. 나는 최근에 갱신 한
사티 야지 트

@satyajit이 솔루션은 Google Pixel의 Android 7.1.1에서 저에게 효과적입니다.
Dick Lucas

3 단계와 4 단계가 있든 없습니까?
satyajit

-1

저는 Android 7.1.1을 사용하고 있습니다. 다음은 매니페스트를 변경하지 않고 내 기기 (OnePlus One)에서 설정하는 방법입니다 (내 앱의 API 21을 타겟팅했습니다).

Charles Proxy에서 :

  1. Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser. 이 단계는 프록시 IP 및 포트 번호와 charles 프록시 SSL을 다운로드해야하는 위치에 대한 링크를 제공합니다.

휴대 전화에서 :

  1. Wifi Settings > Modify Network > Advanced Options. 프록시 설정에 Manual당신은에 찰스로부터받은 IP 및 포트 번호를 입력 Proxy hostname하고 Proxy port각각을.

  2. (선택 사항) Charles가 이전에 제공 한 chls.pro/ssl 링크 에 액세스 할 수도 있고 액세스하지 못할 수도 있습니다 . 내 장치에서 항상 네트워크에 연결되어 있지 않다는 알림을 받았습니다. Bypass proxy for필드에 charlesproxy.com을 추가했습니다 .

  3. 브라우저에서 3 단계의 링크로 이동하여 필요한 인증서를 다운로드합니다 (Chrome에서 작동하지 않는 경우 Dolphin 브라우저를 다운로드). 어떤 이름 으로든 인증서 이름을 지정할 수 있습니다.

Charles Proxy로 돌아 가기 :

  1. 원격 연결을 요청하도록 기본 설정이되어있는 경우 프록시를 사용 하라는 메시지가 Allow또는 Deny전화기에 표시되어야합니다.

이제 Nougat 7.1.1에서 Charles를 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.