Como fazer o proxy Charles funcionar com o Android 7 nougat?

101

O Android 7 introduziu algumas mudanças na forma como os certificados são tratados ( http://android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html ) e, de alguma forma, não consigo mais fazer meu proxy Charles funcionar.

Meu 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>

Estou executando em modo de depuração. Mas não importa o que aconteça, eu entendo javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found..

Desnecessário dizer que instalei um pfxcertificado de Settings -> Security -> Install from storage. O certificado aparece, User Credentialsmas não aparece Trusted credentials -> User. No meu dispositivo pirulito, os certificados estão listados lá.

Estou usando okhttp3 como biblioteca HTTP.

Alguma ideia do que estou fazendo de errado?

mbonnin
fonte
1
Como um teste rápido, tente adicionar / mover useraquele para o <base-config>e ver se isso muda. Não deveria, mas só vai demorar um pouco para tentar.
CommonsWare
Você não precisaria adicionar o CA explícito para Charles em developer.android.com/training/articles/security-config.html : 'Confiando em CAs adicionais', pois o CA Charles é autogerado e não estaria no Cadeia de confiança do sistema Android?
Morrison Chang
@Morisson Chang: Não quero incorporar o Charles CA ao aplicativo, quero poder adicioná-lo manualmente em meu telefone de desenvolvimento, como costumava fazer. DeSettings -> Security -> Install from storage
mbonnin
1. Como você está referenciando o network_security_config.xml no AndroidManifest.xml do seu aplicativo? 2. Você poderia vincular o arquivo .pfx? Presumo que ele contém apenas o certificado CA (sem chaves privadas) e, portanto, deve ser bom para publicar. Estou perguntando porque, se o .pfx contiver uma chave privada, será considerado um arquivo certificado do cliente e, portanto, a CA do arquivo não será instalada como confiável para autenticação do servidor.
Alex Klyubin
1
@AlexKlyubin hurra, está funcionando agora :). Acho que precisava reiniciar meu Charles ou aplicativo ou qualquer outra coisa. Fiquei confuso porque instalei o mesmo arquivo .pfx em inúmeros dispositivos Android antes do nougat e eles foram reconhecidos ok. Mas está tudo bem agora. Você poderia escrever uma resposta para que eu aprove?
mbonnin

Respostas:

26

Com base na discussão de solução de problemas de comentários para o OP, a resposta é instalar apenas o certificado CA do proxy como confiável, não seu cert + chave privada.

O problema foi causado por dois fatores:

  1. Instalar não apenas o certificado CA do proxy MiTM, mas também sua chave privada (permitindo assim que aplicativos VPN no dispositivo descriptografem / tráfego de rede MiTM de outros aplicativos). Você não precisa da chave privada do proxy MiTM no dispositivo.

  2. Alteração do Android Nougat no comportamento do Settings -> Security -> Install from storagefluxo de arquivos que contêm uma chave privada além do (s) certificado (s). Essa mudança de comportamento desmascarou o problema acima.

Antes do Nougat, o Settings -> Security -> Install from storagefluxo de arquivos contendo uma chave privada além de certificados instalava erroneamente os certificados como confiáveis ​​para autenticação de servidor (por exemplo, HTTPS, TLS, tornando assim seu MiTM bem-sucedido), além de ser instalado corretamente como certificados de cliente usados ​​para autenticar este dispositivo Android para servidores. No Nougat, o bug foi corrigido e esses certificados não são mais instalados como confiáveis ​​para autenticação do servidor. Isso evita que as credenciais de autenticação do cliente afetem (entrelace) a segurança das conexões com os servidores. Em seu cenário, isso impede que seu MiTM seja bem-sucedido.

O que complica as coisas é que o Settings -> Security -> Install from storagenão fornece uma maneira explícita para o usuário especificar se está instalando uma credencial de autenticação de cliente (chave privada + cadeia de certificados) ou uma âncora de confiança de autenticação de servidor (apenas um certificado CA - nenhuma chave privada necessária) . Como resultado, o Settings -> Security -> Install from storagefluxo adivinha se está lidando com a credencial de autenticação de cliente / usuário ou âncora de confiança de autenticação de servidor, assumindo que, se uma chave privada for especificada, ela deve ser uma credencial de autenticação de cliente / usuário. No seu caso, assumiu incorretamente que você está instalando uma credencial de autenticação de cliente / usuário em vez de uma âncora de confiança de autenticação de servidor.

PS Com relação à sua configuração de segurança de rede, você provavelmente deve configurar o aplicativo para confiar também nas âncoras de confiança do "sistema" no modo de depuração (seção sobreposições de depuração). Caso contrário, compilações de depuração do aplicativo não funcionarão, a menos que as conexões sejam MiTM por um proxy cujo certificado CA esteja instalado como confiável no dispositivo Android.

Alex Klyubin
fonte
1
Quanto ao PS: a documentação diz Trust anchors specified in debug-overrides are added to all other configurations. Fiquei com a impressão de que ele foi adicionado ao 'base-config' e não o substituiu completamente?
mbonnin
Oh, você está certo. Você não precisa listar explicitamente as âncoras de confiança do "sistema" nas substituições de depuração.
Alex Klyubin
4
Essa resposta não é clara. Consulte a resposta de @stkent abaixo.
Adam Hurwitz
4
Concordo que esta resposta explica o que está acontecendo, mas não está claro quais etapas devem ser seguidas.
StarWind0
114

A solução é não usar .p12 , apenas navegar com o Chrome (com proxy configurado em wi-fi) até http://charlesproxy.com/getssl e instalar o arquivo .pem baixado .

Eu tive exatamente o mesmo problema no meu Nexus 5X rodando o Android 7.0. Anteriormente, havia .p12 exportado de Charles 3.11.5 (Ajuda-> Proxy SSL-> Exportar certificado Charles Root e chave privada). Quando tentei instalar .p12 do telefone (Configurações-> Segurança-> Instalar do armazenamento), ele apareceu apenas em "Credenciais do usuário" e nunca em "Credenciais confiáveis" e, claro, SSL com proxy Charles não funcionou.

O "como fazer" total do Android 7.0 seria assim:

  1. Configure o proxy WiFi + (como Charles o requer). Conecte-o.
  2. No dispositivo, navegue com o Chrome para http://charlesproxy.com/getssl , aceite a solicitação de download .pem e pressione "abrir" para iniciar o aplicativo "Instalador de certificado". Use-o para instalar o certificado como "VPN e aplicativos".
  3. Coloque o atributo android:networkSecurityConfig="@xml/network_security_config"para <application>a Manifest.xml
  4. Crie res / xml / network_security_config.xml com o conteúdo do primeiro post (está totalmente correto).
  5. Abra o Charles e o app e divirta-se.

PS Verifique a data / hora no dispositivo. Deve estar correto.

Alexander Skvortsov
fonte
2
Uma observação importante sobre esta ótima resposta: se seu aplicativo está direcionado à API 23 ou inferior, você não precisa das etapas 3 e 4. Na verdade, você não será capaz de compilar o material network-security-config se tiver a API 23 ou inferior.
David Ferrand
1
Esta é uma ótima solução para Android 7.0. Muito mais claro do que as informações oficiais do Charles Proxy.
Adam Link
3
Provavelmente apenas eu, mas essas etapas não funcionam mais para mim no 7.1.1. Recentemente fiz uma atualização
satyajit de
@satyajit Esta solução está funcionando para mim no Android 7.1.1 em um Google Pixel.
Dick Lucas
com ou sem as etapas 3 e 4?
satyajit
-1

Estou no Android 7.1.1, eis como eu configuro no meu dispositivo (OnePlus One) - sem a alteração do manifesto (eu estava direcionando a API 21 para meu aplicativo):

Em Charles Proxy:

  1. Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser. Estas etapas fornecem o IP do proxy e o número da porta e também o link de onde você deve baixar o SSL do proxy charles.

No seu celular:

  1. Wifi Settings > Modify Network > Advanced Options. Defina Proxy como Manuale insira o IP e o número da porta que você recebeu de Charles em Proxy hostnamee Proxy portrespectivamente.

  2. (OPCIONAL) Você pode ou não acessar o link chls.pro/ssl fornecido por Charles anteriormente. No meu dispositivo, sempre fui notificado de que não tinha conexão de rede. Eu adicionei charlesproxy.com ao Bypass proxy forcampo.

  3. Em seu navegador, vá para o link na etapa 3 e baixe qualquer certificado necessário (se não funcionar no Chrome, baixe Dolphin Browser). Você pode nomear seu certificado com qualquer nome.

De volta ao Charles Proxy:

  1. Você deve receber o prompt para um Allowou o Denyseu telefone para usar o proxy se suas configurações forem padrão para solicitar conexões remotas.

Agora você pode usar Charles no Nougat 7.1.1.

Tiffany
fonte