Se sabe que, en Android, hay un par de herramientas que pueden omitir la fijación de SSL, como Justtrustme, Android-SSL-TrustKiller. En iOS hay ios-SSL-Killswitch.
Tenía 3 opciones para implementar pins ssl en mi aplicación.
- Usando un HttpsURLConnection simple con un PinningTrustManager
- Usar un HttpClient simple con un PinningTrustManager
- Trabajar con PinningTrustManager y PinningSSLSocketFactory más directamente
Probé las 3 opciones, sin embargo, fue posible omitir estos mecanismos. Descubrí que la última opción era poco segura en comparación con otras dos, ya que pocas herramientas no podían omitir pero una sí.
Aquí está mi ejemplo de pseudo código para la fijación.
// Get an instance of the Bouncy Castle KeyStore format
KeyStore trusted = KeyStore.getInstance("BKS");
// Get the raw resource, which contains the keystore with
// your trusted certificates (root and any intermediate certs)
InputStream in = getResources().openRawResource(R.raw.key);
try {
// Initialize the keystore with the provided trusted certificates
// Provide the password of the keystore
trusted.load(in, KEYSTORE_PASSWORD);
} finally {
in.close();
}
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(trusted);
¿Existe alguna solución segura de al menos la mejor solución disponible para la implementación?