Maison >Tutoriel système >Linux >Explication détaillée du processus de connexion HTTPS, de l'attaque et du détournement de l'homme du milieu
Le protocole https est le protocole http+ssl. Le processus de connexion est illustré dans la figure ci-dessous :
Le client envoie une requête https au serveur ;
Après avoir reçu la demande, le serveur génère la clé publique et la clé privée. La clé publique équivaut à un verrou, et la clé privée est équivalente à une clé. Seule la clé privée peut ouvrir le contenu verrouillé par la clé publique ;
L'intermédiaire intercepte la requête envoyée par le client au serveur, puis prétend être le client pour communiquer avec le serveur ; envoie le contenu renvoyé par le serveur au client, et prétend être le serveur avec lequel communiquer le client.
Pour utiliser une attaque de l'homme du milieu, le client doit faire confiance au certificat de l'intermédiaire. Si le client ne lui fait pas confiance, cette méthode d'attaque ne fonctionnera pas.
La raison du détournement de l'homme du milieu est que le certificat du serveur et le nom de domaine ne sont pas vérifiés ou que la vérification est incomplète. Pour plus de commodité, la méthode de vérification par défaut du framework open source est directement utilisée pour les requêtes https
.Comme volley
OKhttp3.0
Méthodes de prévention :
Il existe deux méthodes de prévention
1. Pour les applications ayant des exigences de sécurité relativement élevées, le certificat peut être verrouillé en pré-intégrant le certificat côté client. La communication n'est autorisée que lorsque le certificat client et le certificat serveur sont totalement cohérents, comme certaines applications bancaires. , cette méthode est confrontée à un problème, le problème d'expiration du certificat. Étant donné que le certificat a une certaine période de validité, lorsque le certificat pré-intégré expire, il ne peut être résolu qu'en forçant la mise à jour ou en demandant à l'utilisateur de télécharger le certificat.
Prenons l'exemple de volley : la vérification est mise en œuvre comme suit
Créez SSLSocketFactory via un certificat pré-intégré ;
private static SSLSocketFactory buildSSLSocketFactory(Context context, int certRawResId) { KeyStore keyStore = null; try { keyStore = buildKeyStore(context, certRawResId); } catch (KeyStoreException e) { e.printStackTrace(); } catch (CertificateException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); TrustManagerFactory tmf = null; try { tmf = TrustManagerFactory.getInstance(tmfAlgorithm); tmf.init(keyStore); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); } SSLContext sslContext = null; try { sslContext = SSLContext.getInstance("TLS"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } try { sslContext.init(null, tmf.getTrustManagers(), null); } catch (KeyManagementException e) { e.printStackTrace(); } return sslContext.getSocketFactory();
Générer une connexion vérifiée par SSL et nom de domaine
2 Pour les applications ayant des exigences de sécurité générales, vous pouvez vérifier le nom de domaine, la validité du certificat, les informations sur la clé du certificat et la chaîne de certificat
Prenons Volley comme exemple, réécrivez la méthode checkServerTrusted dans HTTPSTrustManager et activez une vérification forte du nom de domaine
De nombreuses applications utilisent actuellement webview pour charger les pages H5. Si le serveur utilise un certificat émis par une autorité de certification de confiance, surchargez onReceivedSslError() lorsque webView.setWebViewClient(webviewClient) Si une erreur de certificat se produit, appelez directement handler.proceed (). ignorera l'erreur et continuera à charger la page avec le problème de certificat. Si handler.cancel() est appelé, il peut mettre fin au chargement de la page avec le problème de certificat. S'il y a un problème avec le certificat, l'utilisateur peut être. est invité à indiquer les risques et laisse l'utilisateur choisir de charger ou non. Si la sécurité est requise Le niveau est relativement élevé et le chargement de la page peut être interrompu directement, invitant l'utilisateur que l'environnement réseau est risqué :
Il n'est pas recommandé d'utiliser directement handler.proceed(). Si la vue Web doit vérifier fortement le certificat du serveur lors du chargement de https, vous pouvez utiliser HttpsURLConnection pour vérifier fortement le certificat dans onPageStarted() afin de vérifier le certificat du serveur. Si la vérification échoue, arrêtez de charger la page Web. Bien entendu, cela ralentira la vitesse de chargement de la page Web et nécessitera une optimisation supplémentaire. Les méthodes d'optimisation spécifiques dépassent le cadre de cette discussion et ne seront pas expliquées en détail ici.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!