Como instalar o certificado de AC de confiança 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.

o Android armazena certificados CA no seu teclado Java em {[[0]}. Copiei o ficheiro para o meu computador, adicionei o meu certificado usando o portecle 1, 5 e empurrei-o de volta para o dispositivo.

Agora, o Android não parece recarregar o arquivo automaticamente. Eu li em vários posts do blog que eu preciso reiniciar o dispositivo. Fazendo isso resulta no arquivo sendo substituído com o original novamente.

a minha próxima tentativa foi instalar o certificado a partir do cartão SD, copiando-o e usando a opção de acordo com o menu Configuração. O dispositivo diz - me que o certificado foi instalado, mas aparentemente não confia no certificado. Além disso, quando tento copiar o teclado para o meu computador, ainda encontro as acções originais cacerts.bks.

Então, qual é a maneira certa de instalar o meu próprio certificado de root CA em um dispositivo Android 2.2 como um certificado de confiança? Existe uma maneira de fazê-lo programaticamente?

Author: Björn Marschollek, 2010-12-16

7 answers

Antes do Android KitKat você tem que root seu dispositivo para instalar novos certificados.

Desde o Android KitKat (4.0) até o Nougat (7.0) é possível e fácil. Eu fui capaz de instalar o Charles Web Debbuging Proxy cert no meu dispositivo não enraizado e com sucesso cheirar o tráfego SSL.

Extracto de http://wiki.cacert.org/FAQ/ImportRootCert

Antes da versão 4.0 do Android, com a versão Gingerbread & Froyo do Android, havia uma única leitura file (/system/etc/security / cacerts.BKS) contendo a loja de confiança com todos os certificados CA ('system') confiados por padrão no Android. Tanto os aplicativos do sistema quanto todas as aplicações desenvolvidas com o Android SDK usam isso. Use estas instruções na instalação de certificados CAcert em Android Gingerbread, Froyo,... A partir do Android 4.0( Android ICS/ 'Ice Cream Sandwich', Android 4.3 'Jelly Bean' e Android 4.4 'KitKat'), os certificados de confiança do sistema estão no sistema (apenas para leitura) partição na pasta '/sistema/etc/segurança/' como ficheiros individuais. No entanto, os utilizadores podem agora facilmente adicionar os seus próprios certificados de "utilizador" que serão armazenados em "/data/misc/keychain/certs-added".

Os certificados instalados no sistema podem ser geridos no dispositivo Android na secção Configuração - > Segurança - > Certificados - > 'sistema', enquanto que os certificados de confiança do utilizador são registados na secção "utilizador". Ao usar os certificados confiáveis do usuário, o Android irá forçar o usuário do Android dispositivo para implementar medidas de segurança adicionais: o uso de um código PIN, um padrão-lock ou uma senha para desbloquear o dispositivo são obrigatórios quando os certificados fornecidos pelo usuário são usados.

Instalar certificados CAcert como certificados de confiança do utilizador é muito fácil. A instalação de novos certificados como 'sistema confiável'-certificados requer mais trabalho (e requer acesso root), mas tem a vantagem de evitar o requisito Android lockscreen.

Do Android N a partir de agora torna-se mais difícil, veja este extracto do site Charles proxy:

A partir do Android N, você precisa adicionar configuração ao seu aplicativo, a fim de que confie nos certificados SSL gerados por Charles SSL Proxying. Isso significa que você só pode usar SSL Proxy com aplicativos que você controlo.

Para configurar o seu aplicativo para confiar no Charles, você precisa adicionar um Ficheiro de configuração da segurança da rede para a sua aplicação. Este ficheiro pode substituir o padrão do sistema, permitindo que a sua aplicação confie no utilizador instalado Certificados CA (por exemplo, o certificado raiz Charles). Você pode especificar que isto só se aplica nas compilações de depuração da sua aplicação, de modo que a produção constrói usar o perfil de confiança padrão.

Adicionar um ficheiro res / xml / network_security_ Config.xml para a sua aplicação:

<network-security-config>    
    <debug-overrides> 
        <trust-anchors> 
            <!-- Trust user added CAs while debuggable only -->
            <certificates src="user" /> 
        </trust-anchors>    
    </debug-overrides>  
</network-security-config>

Depois adicione uma referência a este ficheiro no manifesto do seu aplicativo, como se segue:

<?xml version="1.0" encoding="utf-8"?> 
<manifest>
    <application android:networkSecurityConfig="@xml/network_security_config">
    </application> 
</manifest>
 71
Author: Dean Wild, 2018-03-01 12:29:32

Passei muito tempo a tentar encontrar uma resposta para isto (preciso do Android para ver os certificados StartSSL). Conclusão: o Android 2.1 e 2.2 permitem a importação de certificados, mas apenas para uso com Wi-Fi e VPN. Não há interface de usuário para atualizar a lista de certificados de raiz confiáveis, mas há discussão sobre a adição dessa funcionalidade. Não está claro se existe uma solução confiável para a atualização manual e substituição dos cacetes.ficheiro bks.

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

 42
Author: Mark Berry, 2010-12-22 02:42:23

Se precisar do seu certificado para ligações HTTPS, pode adicionar o .o ficheiro bks como um recurso raw para a sua aplicação e extender a ligação DefaultHttpConnection para que os seus certificados sejam usados para as ligaçõ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);
        }
    }
}
 15
Author: alexander.egger, 2012-12-21 17:18:20

O guia ligado aqui irá provavelmente responder à pergunta original sem a necessidade de programar um conector SSL personalizado.

Encontrei um guia muito detalhado sobre como importar certificados de root que realmente o ajuda a instalar certificados de CA confiáveis em diferentes versões de dispositivos Android (entre outros dispositivos).

Basicamente vais precisar de:

  1. [[1]}Download: the cacerts.ficheiro bks do teu telemóvel.

    ADB pull /system/etc/security / cacerts.BKS cacerts.bks

  2. Descarrega o .ficheiro crt da Autoridade de certificação que pretende autorizar.

  3. Modificar os cacetes.ficheiro bks no seu computador, usando o fornecedor do BouncyCastle

  4. Carrega os cacerts.arquivo bks de volta para o seu telefone e reinicialização.

Aqui está um passo a passo mais detalhado para atualizar os telefones android mais antigos.: Como actualizar o teclado da Autoridade de certificados de segurança do HTTPS em dispositivo pré-android-4.0
 7
Author: RightHandedMonkey, 2015-02-11 12:22:18
O que fiz para poder usar os certificados startssl foi muito fácil. (no meu telefone enraizado)

Copiei /system/etc/security / cacerts.bks to my sdcard

Transferido http://www.startssl.com/certs/ca.crt e http://www.startssl.com/certs/sub.class1.server.ca.crt

Fui para portecle.sourceforge.net e executou o portecle directamente da página web.

Abri os meus cacetes.ficheiro bks do meu sdcard (não foi introduzido nada quando foi pedido um senha)

Escolha Importar no portacle e abra a sub. class1. server.ca. crt, no meu caso, já tinha a AC.crt, mas talvez você precise instalar isso também.

Guardou o teclado e copiou-o baxck para /system/etc/security/cacerts.bks (eu fiz uma cópia de segurança desse arquivo primeiro só para o caso)

Reiniciei o meu telemóvel e agora posso ver o meu site a usar um certificado startssl sem erros.
 3
Author: hans, 2012-04-18 06:56:48

Há uma solução muito mais fácil para isso do que postado aqui, ou em threads relacionados. Se você está usando uma webview( como eu sou), você pode conseguir isso executando uma função JAVASCRIPT dentro dela. Se você não estiver usando uma webview, você pode querer criar uma escondida para este propósito. Aqui está uma função que funciona em praticamente qualquer navegador (ou webview) para iniciar a instalação da AC (geralmente através do repositório os cert compartilhado, incluindo em um dróide). Usa um bom truque com o iFrames. Apenas passe o url para A.ficheiro crt para esta função:

function installTrustedRootCert( rootCertUrl ){
    id = "rootCertInstaller";
    iframe = document.getElementById( id );
    if( iframe != null ) document.body.removeChild( iframe );
    iframe = document.createElement( "iframe" );
    iframe.id = id;
    iframe.style.display = "none";
    document.body.appendChild( iframe );
    iframe.src = rootCertUrl;
}

Actualização:

O truque do iframe funciona em dróides com a API 19 e acima, mas as versões mais antigas da webview não funcionarão assim. A idéia geral ainda funciona embora - basta baixar/abrir o arquivo com uma webview e, em seguida, deixar o sistema operacional assumir. Esta pode ser uma solução mais fácil e mais universal (no java actual):

 public static void installTrustedRootCert( final String certAddress ){
     WebView certWebView = new WebView( instance_ );
     certWebView.loadUrl( certAddress );
 }

Note que instance_ é uma referência à actividade. Isto funciona perfeitamente se você souber o url para certificado. No meu caso, no entanto, eu resolvo isso dinamicamente com o software do lado do servidor. Eu tive que adicionar uma quantidade razoável de código adicional para interceptar uma url de redirecionamento e chamar isso de uma maneira que não causou um acidente baseado em uma complicação de rosca, mas eu não vou adicionar toda essa confusão aqui...

 3
Author: BuvinJ, 2015-03-12 21:33:14

Aqui está uma solução alternativa que adiciona de facto o seu certificado à lista de certificados predefinidos: confiando em todos os certificados que usam o HttpClient sobre os HTTPS

No entanto, só funcionará para a sua aplicação. Não há maneira de programaticamente fazê-lo para todas as aplicações no dispositivo de um usuário, uma vez que isso seria um risco de segurança.
 0
Author: emmby, 2017-05-23 12:26:23