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 pfx
certificado de Settings -> Security -> Install from storage
. O certificado aparece, User Credentials
mas 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?
fonte
user
aquele para o<base-config>
e ver se isso muda. Não deveria, mas só vai demorar um pouco para tentar.Settings -> Security -> Install from storage
Respostas:
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:
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.
Alteração do Android Nougat no comportamento do
Settings -> Security -> Install from storage
fluxo 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 storage
fluxo 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 storage
nã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, oSettings -> Security -> Install from storage
fluxo 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.
fonte
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?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:
android:networkSecurityConfig="@xml/network_security_config"
para<application>
a Manifest.xmlPS Verifique a data / hora no dispositivo. Deve estar correto.
fonte
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:
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:
Wifi Settings > Modify Network > Advanced Options
. Defina Proxy comoManual
e insira o IP e o número da porta que você recebeu de Charles emProxy hostname
eProxy port
respectivamente.(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 for
campo.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:
Allow
ou oDeny
seu 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.
fonte