Como instalar um certificado CA confiável no dispositivo Android?

Criei o meu próprio certificado CA e agora quero instalá-lo no meu dispositivo Android Froyo (HTC Desire Z), para que o dispositivo confie no meu certificado.

Android armazena certificados CA na sua loja de chaves Java em `/system/etc/security/cacerts.bks'. Eu copiei o arquivo para o meu computador, adicionei meu certificado usando portecle 1.5 e o empurrei de volta para o dispositivo.

Agora, o Android não parece recarregar o arquivo automaticamente. Eu li em vários blogs que preciso reiniciar o dispositivo. Fazendo isso, o arquivo é substituído pelo original novamente.

Minha próxima tentativa foi instalar o certificado do cartão SD, copiando-o e usando a opção de acordo com o menu de configurações. O dispositivo me diz que o certificado foi instalado, mas aparentemente ele não confia no certificado. Além disso, quando eu tento copiar o keystore para o meu computador, eu ainda encontro o estoque original `cacerts.bks'.

Então, qual é a maneira correta de instalar meu próprio certificado CA raiz em um dispositivo Android 2.2 como um certificado confiável? Existe uma forma de o fazer de forma programática?

Passei muito tempo tentando encontrar uma resposta para isso (preciso do Android para ver os certificados StartSSL). Conclusão: O Android 2.1 e 2.2 permitem importar certificados, mas apenas para uso com WiFi e VPN. Não há interface de usuário para atualizar a lista de certificados de root confiáveis, mas há discussão sobre a adição dessa funcionalidade. Não está claro se existe uma alternativa confiável para atualizar e substituir manualmente o arquivo cacerts.bks.

Detalhes e links: http://www.mcbsys.com/techblog/2010/12/android-certificates/. Nesse post, veja o link para o bug 11231 do Android -- você pode querer adicionar seu voto e consulta a esse bug.

Comentários (4)

Se você precisar do seu certificado para conexões HTTPS, você pode adicionar o arquivo .bks como um recurso bruto à sua aplicação e estender a DefaultHttpConnection para que seus certificados sejam usados para conexões HTTPS.

public class MyHttpClient extends DefaultHttpClient {

    private Resources _resources;

    public MyHttpClient(Resources resources) {
        _resources = resources;
    }

    @Override
    protected ClientConnectionManager createClientConnectionManager() {
        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory
            .getSocketFactory(), 80));
        if (_resources != null) {
            registry.register(new Scheme("https", newSslSocketFactory(), 443));
        } else {
            registry.register(new Scheme("https", SSLSocketFactory
                .getSocketFactory(), 443));
        }
        return new SingleClientConnManager(getParams(), registry);
    }

    private SSLSocketFactory newSslSocketFactory() {
        try {
            KeyStore trusted = KeyStore.getInstance("BKS");
            InputStream in = _resources.openRawResource(R.raw.mystore);
            try {
                trusted.load(in, "pwd".toCharArray());
            } finally {
                in.close();
            }
            return new SSLSocketFactory(trusted);
        } catch (Exception e) {
            throw new AssertionError(e);
        }
    }
}
Comentários (5)

Aqui's uma solução alternativa que realmente adiciona o seu certificado à lista de certificados incorporados: https://stackoverflow.com/questions/2642777/trusting-all-certificates-using-httpclient-over-https/6378872#6378872

No entanto, só funcionará para a sua candidatura. Não existe's nenhuma maneira de programar todas as aplicações num dispositivo do utilizador's, uma vez que isso seria um risco de segurança.

Comentários (0)