È noto infatti che in Android ci sono un paio di strumenti che possono aggirare il pin ssl come Justtrustme, Android-SSL-TrustKiller. In iOS ci sono ios-SSL-Killswitch.
Ho avuto 3 opzioni per implementare il pin ssl nella mia applicazione.
- Uso di un semplice HttpsURLConnection con un PinningTrustManager
- Uso di un semplice HttpClient con un PinningTrustManager
- Lavorare con PinningTrustManager e PinningSSLSocketFactory di più direttamente
Ho provato tutte e 3 le opzioni, tuttavia è stato possibile aggirare questo meccanismo. Ho trovato che l'ultima opzione era un po 'sicura rispetto ad altri due come pochi strumenti non erano in grado di bypassare, ma uno ha fatto.
Ecco il mio esempio di pseudo codice per il blocco.
// 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);
Esiste una soluzione sicura almeno della migliore soluzione disponibile per l'implementazione?