2012-02-24 15 views

Respuesta

7

Si es sólo el cliente y el servidor, puede (y debe) utilizar SSL sin comprar nada. Usted controla el servidor y el cliente, por lo que cada uno solo debe confiar en un certificado, el que pertenece al otro y no necesita CA para este fin.

Aquí está el enfoque de alto nivel. Cree un certificado SSL de servidor autofirmado e impleméntelo en su servidor web. Puede utilizar la herramienta de claves incluida con el SDK de Android para este fin. Luego, cree un cliente autofirmado e impleméntelo dentro de su aplicación en un almacén de claves personalizado incluido en su aplicación como recurso (keytool también lo generará). Configure el servidor para que requiera autenticación SSL del lado del cliente y solo acepte el certificado del cliente que haya generado. Configure el cliente para que use ese certificado del lado del cliente para identificarse y solo acepte el certificado del lado del servidor que instaló en su servidor para esa parte del mismo.

Un paso a paso para esto es una respuesta mucho más larga de lo que está garantizado aquí. Sugeriría hacer esto en etapas, ya que hay recursos en la web sobre cómo lidiar con el certificado SSL autofirmado en Android, tanto del lado del servidor como del lado del cliente. También hay un recorrido completo en mi libro, Application Security for the Android Platform, publicado por O'Reilly.


Usted normalmente tienda que/clave privada del certificado en un almacén de claves de sometype (un almacén de claves si está usando Android) y que almacén de claves se cifrará. Esa encriptación se basa en una contraseña, por lo que deberá (1) almacenar esa contraseña en su cliente en alguna parte, o (2) pedirle al usuario la contraseña cuando inicie su aplicación cliente. Lo que debe hacer depende de su uso. Si (2) es aceptable, entonces ha protegido su credencial contra la ingeniería inversa, ya que será encriptada y la contraseña no se almacenará en ningún lugar (pero el usuario deberá ingresarla cada vez). Si lo hace (1), alguien podrá realizar una ingeniería inversa de su cliente, obtener la contraseña, obtener el almacén de claves, descifrar la clave privada y el certificado, y crear otro cliente que pueda conectarse al servidor.

No hay nada que pueda hacer para evitar esto; puede hacer que la ingeniería inversa sea más difícil para su código (por ofuscación, etc.) pero no puede hacerlo imposible. Debe determinar cuál es el riesgo que está tratando de mitigar con estos enfoques y cuánto trabajo vale la pena para mitigarlo.

+0

¿Es posible que alguien robe este certificado de la aplicación y lo use en una aplicación falsa? – pyeleven

+0

Sí. Ver la respuesta revisada arriba. – jeffsix

+0

Esto es suficiente información para tomar nuestra decisión, ¡gracias! Me gustaría entender cómo se relaciona el certificado de la aplicación de Android con todo esto, ¿me pueden orientar en la dirección correcta? Quiero decir, ¿se puede usar el certificado de la aplicación como un certificado ssl del lado del cliente? – pyeleven

1

Supongo que esto funcionará con la autenticación adecuada en su lugar. En primer post que acaba de stumpled sobre era éste: Securing communication from android to a web service espero que ayude =)

+0

Lamentablemente necesitamos esto porque la característica que implementaremos no usará autenticación. – pyeleven

1

Si estás absolutamente seguro sólo necesitará este servicio web para ser visitada por aplicaciones/dispositivos autorizados, ir con los certificados SSL del lado del cliente y restringir el acceso en el servidor solo a clientes con certificados autorizados. Esto tiene la característica extra de forzar SSL en todo momento para que no te gusten los secretos de autenticación sobre un canal abierto. He aquí una guía rápida para Apache, pero se puede usar nginx también:

http://it.toolbox.com/blogs/securitymonkey/howto-securing-a-website-with-client-ssl-certificates-11500

+0

¿Puede este certificado ser copiado por una aplicación diferente? ¿Esa aplicación podrá explotar el servicio? – pyeleven

Cuestiones relacionadas