La instalación del certificado autofirmado se realiza correctamente, pero Android actúa como si el certificado no estuviera allí

17

Estoy intentando instalar el certificado autofirmado para mi servidor web en Android 4.3. Tengo el archivo .crt en la raíz de la tarjeta SD (que en realidad está emulado porque no tengo tarjeta SD en la ranura).

Para instalar el certificado, vaya a Configuración -> General -> Seguridad -> Almacenamiento de credenciales -> Instalar desde el almacenamiento del dispositivo.

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), un menú desplegable "usado para" con "VPN y aplicaciones" seleccionado y texto en la parte inferior del cuadro de diálogo que informa "El paquete contiene: un certificado de usuario". Todo se ve bien, así que hago clic en "Aceptar". El cuadro de diálogo desaparece y aparece un mensaje emergente con "[nombre] instalado".

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

¿Qué estoy haciendo mal? La falta total de mensajes de error no es útil. ¿Es posible que mi certificado tenga el formato incorrecto? He intentado usar el archivo .crt en el directorio ssl del servidor y he intentado convertirlo al formato DER.

Actualización: leí en alguna parte que Android requiere que los certificados estén en formato p12, así que convertí el certificado Apache2 a p12 usando el siguiente comando:

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

Luego repetí los pasos anteriores, recibí el mismo mensaje de éxito y luego seguí sin ver el certificado en las credenciales del usuario y sigo recibiendo el error de certificado no confiable del navegador móvil.

Miguel
fuente

Respuestas:

19

Tuve el mismo problema para que Android realmente instalara el certificado, hasta que encontré este sitio que describe un método que me funcionó. 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. Convierta el certificado al formato DER, que Android entiende:

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

  3. Utilice cualquier método para acceder my_site.der.crta su 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 le permite instalarlo automáticamente.

Aunque me hubiera gustado que el paso 1 se dividiera en dos (1a. Generación de clave privada y 1b. Generación de certificado público), no pasé demasiado tiempo investigando cómo hacerlo. Por favor, avíseme en un comentario si encontró una manera que funcione, gracias.

(En lugar de agregar un comentario, siento que esto realmente pertenece como parte de la respuesta para referencia futura, así que lo estoy editando. --Michael)

En lugar de crear un certificado habilitado como CA, creé una CA autofirmada y luego volví a firmar mi clave / csr existente con la nueva CA. Luego agregué la CA autofirmada a Android y ¡listo! ¡Funcionó!

Generando 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 una CSR existente que tuve desde la creación de la clave desde el

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

Ahora, usando una forma modificada de su segundo comando, convertí el certificado CA al formulario DER:

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

Lo mejor de esto es que cualquier certificado adicional no confiable que ahora se vuelva a firmar con la nueva CA autofirmada ahora será confiable 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 tiene control, pero podría facilitarlo si tiene alguna influencia sobre (digamos) su departamento de TI para un servidor interno o algo así.

FriendFX
fuente
1
Ya tengo el certificado que necesito instalar, así que intenté el paso 2 y aún no aparece en las Credenciales de confianza del usuario después de que afirma que se instaló correctamente, y Chrome todavía muestra el error "sitio no confiable" después de reiniciar.
Michael
1
¿Podría haber algo sobre la extensión v3_req y habilitada como CA que el certificado debe tener para que Android la use? Si es así, ¿hay algún comando que pueda usar para tomar un certificado existente y agregarle esa información, ya que no tengo control sobre todos los certificados que quiero instalar?
Michael
3
Para responder a la primera mitad de mi pregunta anterior, leí la página que había vinculado, y parece que el problema es que Android se niega a instalar certificados autofirmados (pero no CA autofirmadas). Esto parece no estar documentado, y el hecho de que Android pretenda instalarlo lo hace aún peor. Pero la pregunta sigue siendo, si tengo un certificado autofirmado sobre el que no tengo control, ¿hay alguna forma de "CA" -cifrarlo para poder instalarlo?
Michael
1
@ Espero que no te importe, voy a editar tu respuesta para incluir mi solución, en lugar de incluirla en los comentarios, ya que realmente pertenece como parte de la respuesta.
Michael
1
No entiendo cómo se genera la solicitud de firma existente .csr. Creo que este es el último punto que falta para un tutorial completo paso a paso.
cguenther