19 votos

La instalación de un certificado autofirmado se realiza con éxito, pero Android actúa como si el certificado no estuviera allí

Estoy intentando instalar el certificado autofirmado para mi servidor web en Android 4.3. Tengo el archivo .crt en el Root de la tarjeta SD (que en realidad es emulada ya que no tengo tarjeta SD en la ranura).

Para instalar el certificado voy a Setting -> General -> Security -> Credential Storage -> Install from device storage.

Me aparece un cuadro de diálogo que muestra el nombre del certificado (el nombre del archivo menos la extensión .crt) que puedo modificar (pero no lo hago), un desplegable "usado para" con "VPN y aplicaciones" seleccionado y un texto en la parte inferior del cuadro de diálogo que informa "El paquete contiene: un certificado de usuario". Todo parece correcto, así que hago clic en "Aceptar". El diálogo desaparece y aparece un mensaje de bienvenida con "[nombre] instalado".

Sin embargo, si voy inmediatamente a "Credenciales de confianza" y selecciono "Usuario", no hay nada. El nuevo certificado tampoco está en "Sistema", pero no esperaba que estuviera allí. Si voy a un navegador después de esto y trato de ir a mi sitio web, sigo recibiendo la advertencia de que el certificado del sitio no es de confianza. También he probado a reiniciar, pero no hay ninguna diferencia.

¿Qué estoy haciendo mal? La ausencia total de mensajes de error no ayuda. ¿Es posible que mi certificado esté en un formato incorrecto? He intentado usar el archivo .crt en el directorio ssl del servidor y he intentado convertirlo a formato DER.

Actualización: He leído en algún sitio que Android requiere que los certificados estén en formato p12, así que he convertido el certificado de Apache2 a p12 usando el siguiente comando:

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

Luego repetí los pasos anteriores, obtuve el mismo mensaje de éxito, y luego procedí a seguir sin ver el certificado en las credenciales de usuario y sigo obteniendo el error de certificado no confiable desde el navegador del móvil.

20voto

FriendFX Puntos 196

Tuve el mismo problema para conseguir que Android instalara realmente el certificado, hasta que encontré este sitio que describe un método que me ha funcionado. Se reduce a los siguientes pasos:

  1. Cree una clave privada y un certificado público x509 con extensiones v3_req y habilitado como 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. Convierte el certificado a formato DER, que es entendido por Android:

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

  3. Utilice cualquier método para obtener el my_site.der.crt a tu dispositivo Android - me resultó fácil tener el archivo alojado en mi servidor web y descargarlo a través del navegador de Android, que luego te permite instalarlo automáticamente.

Aunque me hubiera gustado que el paso 1 se dividiera en dos (1a. generación de la clave privada y 1b. generación del certificado público), no he invertido demasiado tiempo en investigar cómo hacerlo. Por favor, hazme saber en un comentario si has encontrado una manera que funcione, gracias.

(En lugar de añadir un comentario, creo que esto debe formar parte de la respuesta para futuras referencias, así que lo edito. -Michael)

En lugar de crear un certificado habilitado como CA, he creado una CA autofirmada y luego he vuelto a firmar mi clave/csr existente con la nueva CA. Luego añadí la CA autofirmada a Android y ¡voilá! ¡Funcionó!

Generación de la CA autofirmada:

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

Volver a firmar un CSR existente que tenía desde la creación de la clave del

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

Ahora, utilizando una forma modificada de tu segundo comando, he convertido el certificado de la CA a la forma DER:

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

Lo bueno de esto es que cualquier certificado adicional que no sea de confianza y que haya sido re-firmado con la nueva CA auto-firmada, ahora será de confianza en cualquier dispositivo que tenga la nueva CA instalada sin necesidad de instalar nada más. Esto no resuelve exactamente el problema de confiar en sitios sobre los que no tienes control, pero podría facilitarlo si tienes alguna influencia sobre (digamos) tu departamento de TI para un servidor interno o algo así.

1 votos

Ya tengo el certificado que necesito instalar, así que probé el paso 2 y sigue sin aparecer en Credenciales de confianza del usuario después de que afirma que se ha instalado con éxito, y Chrome sigue mostrando el error de "sitio no fiable" después de reiniciar.

1 votos

¿Podría haber algo sobre la extensión v3_req y habilitada como CA que el certificado debe tener para que Android lo utilice? Si es así, ¿hay algún comando que pueda utilizar para tomar un certificado existente y añadirle esa información, ya que no tengo control sobre todos los certificados que quiero instalar.

3 votos

Para responder a la primera mitad de mi pregunta anterior, he leído la página que habías enlazado, y parece que el problema es que Android se niega a instalar certificados autofirmados (pero no CAs autofirmadas). Esto parece no estar documentado, y el hecho de que Android pretenda instalar lo hace aún peor. Pero la pregunta sigue siendo, si tengo un cert autofirmado sobre el que no tengo control, ¿hay alguna manera de "CA"-ificarlo para poder instalarlo?

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X