Pergunta sobre android, ssl, ssl-certificate, x509certificate – Erro: nome que não maquina para certificados SSL autoassinados no Android

2

Estou tentando acessar meu aplicativo da web protegido por SSL de um Android 2.3.4 usando o navegador interno.

O certificado do servidor é um certificado autoassinado que eu criei usandoMAKECERT e instalado no servidor. Quando tento acessar a página, recebo uma mensagem de erro do navegador informandoThe name of the site does not match name on the certificate.

Eu verifiquei e o endereço do servidor é exatamente o nome comum do meu certificado (na verdade, é apenas um endereço IP).

A mensagem não aparece quando tento acessar, no dispositivo Android, outros sites protegidos com certificados não assinados.

Se eu acessar a mesma página usando o IE ou o Chrome em uma área de trabalho - à parte para a mensagem de autoridade de assinatura - não receberei avisos e, depois de instalar o certificado na CA Raiz Confiável, o certificado será aceito sem problemas pelo navegador.

Devo entender que a mensagem é, na verdade, uma rejeição do certificado autoassinado pelo Android?

Estou um pouco intrigado com isso.

Eu tentei instalar o certificado no armazenamento de credenciais, mas isso não melhora a situação. e agora não tenho ideia do que vou tentar em seguida.

As perguntas são: Há alguma coisa em particular que eu deva seguir para criar um certificado autoassinado aceitável para o Android? Alguém conseguiu obter os certificados auto-assinados aceitos pelo Android sem esse aviso?

O que mais eu poderia tentar?

-ATUALIZAR- A resposta de Bruno me guiou na direção certa, então eu consegui dar um passo à frente: refiz o certificado adicionando SAN (tive que abandonarMAKECERT paraOpenSSL, seguindo aliinstruções de Andy Arismendi).

Agora a mensagem desapareceu, mas eu estou bloqueado no problema "autoridade de certificação não confiável" já discutidonesta postagem do SO, então ainda estou trabalhando para encontrar uma solução final para o meu problema - não ter nenhum aviso aparecendo no navegador Android.

Sua resposta

3   a resposta
4

Eu verifiquei e o endereço do servidor é exatamente o nome comum do meu certificado (na verdade, é apenas um endereço IP).

O verificador de nome de host do Android é mais estritamente compatível comRFC 2818 do que alguns navegadores. De acordo com a especificação, se um endereço IP for usado, ele deve estar em uma entrada de Nome Alternativo de Assunto deendereço de IP tipo: não em uma entrada SAN do tipo DNS ou no CN:

Se uma extensão subjectAltName do tipo dNSName estiver presente, ela DEVE ser usada como a identidade. Caso contrário, o campo Nome Comum (mais específico) no campo Assunto do certificado DEVE ser usado. Embora o uso do Nome Comum seja uma prática existente, ele é reprovado e as Autoridades de Certificação são incentivadas a usar o dNSName.

[...]

Em alguns casos, o URI é especificado como um endereço IP em vez de um nome de host. Nesse caso, o iPAddress subjectAltName deve estar presente no certificado e deve corresponder exatamente ao IP no URI.

O mais fácil seria usar um nome de host. (O uso de endereços IP em certificados nunca é realmente prático.) Como alternativa, gere um certificado com uma entrada de endereço IP da SAN. (Você pode estar interessadoisto.)

@noloader, Os documentos do CA / Browser e o RFC 2818/6125 não são mutuamente exclusivos. (A documentação da CA / Browser é mais sobre procedimentos para emitir e verificar um certificado, enquanto esta parte da RFC 2818 é mais limitada à correspondência de nomes, do ponto de vista técnico). AFAIK, O requisito da linha de base do CA / Browser simplesmente torna a SAN mais estritamente necessária, para certificados EV. Não tenho certeza sobrecom.android.browser, mas provavelmente também aceita certs não EV (caso em que eles não precisam estar de acordo com as especificações do CA / Browser), embora os certificados de EV sejam certamente obrigados a cumprir (e, portanto, realmente ter uma SAN). Bruno
você sabe o que está sendo usado porcom.android.browser? É o RFC acima, ou são os documentos dos fóruns do CA / Browser? (Requisitos Básicos para a Emissão e Gerenciamento de Certificados Publicamente Confiáveis eDiretrizes para Certificados EV SSL) jww
1

Primeiro, o armazenamento de credenciais no Android 2.x é apenas para os aplicativos VPN e WiFi, o navegador não o vê. Você não pode instalar seu próprio certificado no armazenamento de certificados confiáveis ​​(a menos que tenha um dispositivo root).

Você é o nosso webapp em um endereço IP público ou local que você está acessando via WiFi? Você pode querer olhar para a saída do logcat, pode haver alguns avisos que lhe dará uma dica lá. Também tente de outro dispositivo e / ou o emulador (diferente versão do Android, se possível) e compare mensagens / comportamento.

0

Por isso, ainda estou trabalhando para encontrar uma solução final para o meu problema - não ter nenhum aviso aparecendo no navegador do Android

Nikolay Elenkov lhe disse porque você não pode salvar um certificado para a loja confiável no Android. Isso mudou recentemente, mas não ajuda com clientes Android mais antigos. Para uma breve história do Keychain e Keystore do Android, consulteHá algum armazenamento de certificados do sistema no Android? (refere-se a dois posts de Nikolay).

Como você está trabalhando no navegador Android, é necessário usar uma CA que já esteja presente na loja do Android. Para obter um certificado de servidor de uma autoridade de certificação já confiável, tenteStartCom. A StartCom oferece certificados gratuitos de Classe 1 e sua raiz é confiável na maioria dos navegadores móveis e de desktop. (Lembre-se de que eles cobram pela revogação, se necessário).

Para completar, se você escreveu o cliente você mesmo, então você forneceria umX509TrustManager e anularcheckServerTrusted para aceitar seu certificado. Não exigiria qualquer interação com um Keystore, Keychain ou CAs externas. Mas você não tem essa opção porque não escreveu o navegador.

Perguntas relacionadas