2012-01-26 15 views
7

Mi objetivo: Crear una configuración de WiFi EAP, incluido el certificado de CA, en Android programmetcally.¿Cómo instalar mediante programación un certificado de CA (para la configuración de EAP WiFi) en Android?

Problema: ¿Cómo se instala un certificado de CA mediante programación (y después hacer referencia a ese certificado en la configuración EAP-Fi)?

He encontrado un enlace muy útil ya que me permite crear y guardar configuraciones WiFi EAP aquí: How to programmatically create and read WEP/EAP WiFi configurations in Android?

Sin embargo, esto supone que ya ha instalado el certificado CA en el dispositivo. Me gustaría instalar el certificado en mi aplicación, ya sea desde los recursos de la aplicación o desde un servidor.

¿Esto es posible? (El enraizamiento no es una opción en este caso). Si es así, ¿cómo?

Otros detalles ...

También encontré una manera de agregar un certificado a un almacén de claves: https://stackoverflow.com/a/4490543/1172101

Sin embargo, esto se utiliza específicamente para crear una conexión segura y la conexión a través de HTTPS. Quiero usar el certificado para WiFi.


Desafortunadamente, todavía tengo que encontrar la forma de instalar un certificado de CA de forma programática, desde dentro de la aplicación.

Sin embargo, es posible instalar un certificado a través del navegador web en Android. Por lo tanto, la solución (por ahora) es: Iniciar un intento para abrir una URL en el navegador web que va directamente al certificado de CA.

esto funciona, pero hay algunos desafíos:

  • El usuario debe nombrar el certificado. Esto es un desafío porque estamos agregando la configuración de WiFi de forma programática. Por lo tanto, debemos pedirle al usuario que otorgue el certificado con el mismo nombre.
  • El usuario debe ingresar una contraseña. Si no tienen una contraseña configurada, el usuario creará una y la ingresará dos veces. Si han establecido una contraseña de seguridad, el usuario tendrá que recordar esa misma contraseña e ingresarla.
  • Suponiendo que el usuario completa con éxito estos pasos, se queda colgando en el navegador.

Esto conduce a una serie de preguntas:

  • Desde mi aplicación, ¿hay una manera de forzar un nombre para el certificado que el usuario instala a través del navegador?
  • Desde mi aplicación, ¿hay alguna manera de saber cuándo se completó la instalación del certificado y luego volver a enfocar mi aplicación?

Solo hágamelo saber si necesita alguna aclaración.

Respuesta

6

No puede instalarlo directamente ya que las aplicaciones que no son del sistema no tienen acceso al almacén de claves.En ICS, hay una API para este KeyChain.createInstallIntent() que abriría un diálogo del sistema preguntando al usuario si desea instalar el certificado. En el pre-ICS, puede lograr lo mismo iniciando el intento de instalación usando directamente el nombre del componente (esto puede o no funcionar en todos los dispositivos). Pasar por el navegador es en realidad una forma indirecta de hacer lo mismo.

En cuanto a sus preguntas:

  1. no se puede especificar/forzar un nombre. ¿Por qué te importa el nombre real?
  2. No es realmente a través del navegador. Si usa la intención del sistema, puede regresar a su actividad y recibirá una devolución de llamada si usa startActivityForResult().

Actualización: Android 4.3 tiene WifiEnterpriseConfig que crea un perfil e instala claves y certificados en el almacén de credenciales del sistema. Solo necesita el permiso CHANGE_WIFI_STATE.

+0

Hola, Nikolay, leí tu publicación en el Keystore aquí: - http://nelenkov.blogspot.in/2012/05/storing-application-secrets-in-androids.html ¿Puedo usar esto para pasar programáticamente el cert de Ca desde mi aplicación a la clase WifiConfiguration. La clase WifiConfiguration se referirá a mi almacén de claves de la aplicación en lugar del almacén de claves del sistema –

0

estoy buscando lo mismo ... en cuanto a su pregunta, @Nikolay:

no se puede especificar/forzar un nombre. ¿Por qué te importa el nombre real?

El perfil EAP necesita el nombre de la CA ya instalada. Si nos fijamos en el ejemplo en la parte 4, se puede especificar:

final String ENTERPRISE_CA_CERT = ""; 

En el ejemplo, el perfil no utiliza el nombre de CA, pero que podría ser el caso de otros perfiles EAP.

0

Actualmente estoy tratando de resolver los mismos problemas. Lo mejor que he encontrado es KeyChain.choosePrivateKeyAlias ​​() que permite al usuario seleccionar qué certificado usar para SSL. Desde allí puede recuperar el nombre de Alias ​​y pasarlo a la configuración de wifi de la empresa.

Cuestiones relacionadas