instalação de certificado autoassinado alega sucesso, mas o Android age como se o certificado não estivesse lá

17

Estou tentando instalar o certificado autoassinado para meu servidor Web no Android 4.3. Eu tenho o arquivo .crt na raiz do cartão SD (que é realmente emulado porque não tenho cartão SD no slot).

Para instalar o certificado, vá para Configuração -> Geral -> Segurança -> Armazenamento de credenciais -> Instalar a partir do armazenamento do dispositivo.

Eu recebo uma caixa de diálogo mostrando o nome do certificado (o nome do arquivo menos a extensão .crt) que eu posso modificar (mas não o faço), um "usado para" suspenso com "VPN e aplicativos" selecionado e texto na parte inferior da caixa de diálogo que informa "O pacote contém: um certificado de usuário". Tudo parece bem, então eu clico em "Ok". A caixa de diálogo desaparece e uma mensagem de brinde aparece com "[nome] instalado".

No entanto, se eu for imediatamente para "Credenciais confiáveis ​​e selecionar" Usuário ", não há nada! O novo certificado também não está em" Sistema ", mas eu não esperava por isso. Se eu for para um navegador depois disso e tentar ir para o meu Ainda recebo o aviso de que o certificado do site não é confiável.Também tentei reiniciar, mas isso não faz diferença.

O que estou fazendo de errado? A completa falta de mensagens de erro não é útil. É possível que meu certificado esteja no formato errado? Eu tentei usar o arquivo .crt no diretório ssl do servidor e tentei convertê-lo para o formato DER.

Atualização: eu li em algum lugar que o Android exige que os certificados estejam no formato p12, então converti o certificado Apache2 para p12 usando o seguinte comando:

openssl pkcs12 -export -inkey server.key -in server.crt -out ~/server.p12

Repeti as etapas acima, recebi a mesma mensagem de sucesso e continuei a não ver o certificado nas credenciais do usuário e ainda recebo o erro de certificado não confiável no navegador móvel.

Michael
fonte

Respostas:

19

Eu tive o mesmo problema ao fazer o Android realmente instalar o certificado, até encontrar este site que descreve um método que funcionou para mim. Tudo se resume às seguintes etapas:

  1. Crie uma chave privada e um certificado x509 público com extensões v3_req e habilitado como uma CA:

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/ssl/private/my_site.key -out /etc/ssl/certs/my_site.crt -reqexts v3_req -extensions v3_ca

  2. Converta o certificado para o formato DER, que é entendido pelo Android:

    sudo openssl x509 -in /etc/ssl/certs/my_site.crt -outform der -out my_site.der.crt

  3. Use qualquer método para obter o my_site.der.crtdispositivo Android - achei fácil apenas ter o arquivo hospedado no meu servidor da Web e fazer o download através do navegador Android, que automaticamente permite a instalação.

Embora eu gostaria que a etapa 1 fosse dividida em duas (1a. Geração de chave privada e 1b. Geração de certificado público), não investi muito tempo investigando como fazer isso. Por favor, deixe-me saber em um comentário se você encontrou uma maneira que funciona, obrigado.

(Em vez de adicionar um comentário, acho que isso realmente pertence como parte da resposta para referência futura, por isso estou editando-o. - Michael)

Em vez de criar um certificado ativado como uma autoridade de certificação, criei uma autoridade de certificação autoassinada e reescrevi minha chave existente / csr com a nova autoridade de certificação. Então eu adicionei a CA autoassinada ao Android e pronto! Funcionou!

Gerando a CA autoassinada:

openssl genrsa -out rootCA.key 4096
openssl req -x509 -new -nodes -key rootCA.key -days 3650 -out rootCA.pem

Assinando novamente um CSR existente que eu tive desde a criação da chave do

openssl x509 -req -in existing.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out existing.crt -days 3649

Agora, usando um formulário modificado do seu segundo comando, converti o certificado CA para o formulário DER:

openssl x509 -in /etc/apache2/ssl/rootCA.pem -outform der -out ~/rootCA.der.crt

O melhor de tudo isso é que qualquer certificado não confiável adicional que agora seja assinado novamente com a nova CA autoassinada agora será confiável em qualquer dispositivo que tenha a nova CA instalada sem a necessidade de instalar mais nada. Isso não resolve exatamente o problema de confiar em sites sobre os quais você não tem controle, mas pode facilitar se você tiver alguma influência sobre (digamos) seu departamento de TI em um servidor interno ou algo assim.

FriendFX
fonte
1
Já tenho o certificado que preciso instalar, então tentei a etapa 2 e ela ainda não aparece nas credenciais do usuário confiável após a instalação ser bem-sucedida, e o Chrome ainda exibe o erro "site não confiável" após reiniciar.
Michael
1
Poderia haver algo sobre a extensão v3_req e habilitado como CA que o certificado precisa ter para o Android usá-lo? Nesse caso, existe um comando que eu possa usar para obter um certificado existente e adicionar essa informação a ele, pois não tenho controle sobre todos os certificados que quero instalar.
Michael
3
Para responder à primeira metade da minha pergunta anterior, li a página que você vinculou e parece que o problema é que o Android se recusa a instalar certificados autoassinados (mas não as CAs autoassinadas). Isso parece não ter sido documentado, e o fato de o Android pretender instalar o torna ainda pior. Mas a questão permanece: se eu tenho um certificado autoassinado sobre o qual não tenho controle, existe alguma maneira de "CA" - habilitá-lo para que eu possa instalá-lo?
Michael
1
@ Espero que não se importe, vou editar sua resposta para incluir minha solução, em vez de incluí-la nos comentários, pois ela realmente pertence como parte da resposta.
Michael
1
Não entendi como a solicitação de assinatura existente.csr é gerada. Eu acho que este é o último ponto que falta para um tutorial completo passo a passo.
cguenther