Κοινή χρήση τεχνολογίας

Λεπτομερής επεξήγηση του Okhttp hostnameVerifier

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Εισαγωγή μεθόδου

Αυτή η ανάρτηση ιστολογίου αναλύεται χρησιμοποιώντας το Okhttp 4.6.0hostnameVerfierΌπως υποδηλώνει το όνομα, η κύρια λειτουργία αυτής της μεθόδου είναι η αναγνώρισηhostnname της νομιμότητας. Μπορούμε να διαμορφώσουμε μόνοι μας το Okhttp κατά την προετοιμασίαhostnameVerfier

new OkHttpClient.Builder()
    .connectTimeout(20, TimeUnit.SECONDS)
    .readTimeout(20, TimeUnit.SECONDS)
    .writeTimeout(35, TimeUnit.SECONDS)  
    .hostnameVerifier(new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            //注意这里在生产环境中千万不要直接写死true          
            return true;
        }
    })
    .build();

αλλάΥπάρχουν πολλές πληροφορίες στο διαδίκτυο σχετικά μεverfiyΗ άμεση επιστροφή της αλήθειας είναι πολύ επικίνδυνη.Φυσικά, εάν το vertify επιστρέφει fasle, αυτό σημαίνει ότι η επαλήθευση ονόματος κεντρικού υπολογιστή δεν μπορεί να πετύχει και το αίτημα http δεν μπορεί να πετύχει. Για παράδειγμα, εάν ξεκινήσω ένα αίτημα http με τη διεύθυνση του ιστολογίου μου, το μήνυμα σφάλματος είναι το εξής:
Εισαγάγετε την περιγραφή της εικόνας εδώ

{http errorCode=-500, mErrorMsg=Hostname yanchen.blog.csdn.net not verified:
    certificate: sha256/tlnf6pbfeu257hnJ9e6j4A1ZWH3vVMzn3Zn3F9kLHdg=
    DN: CN=*.blog.csdn.net
    subjectAltNames: [*.blog.csdn.net]}

Το μέρος όπου εκτελείται η επαλήθευση είναιRealConnectionΜέσα, μετά την εκτέλεση.
Εισαγάγετε την περιγραφή της εικόνας εδώ

Εκτός από την προσαρμογήhostnameVerfierΕπιπλέον, το Okhttp παρέχει μια προεπιλεγμένη υλοποίηση. Τώρα ας αναλύσουμε τις εσωτερικές αρχές.

Βασικές αρχές

Το OkHostnameVerifier είναι ενσωματωμένο στο Okhttp και αυτή η μέθοδος περνάειsession.peerCertificates[0] as X509CertificateΛάβετε το αντικείμενο πιστοποιητικού

override fun verify(host: String, session: SSLSession): Boolean {
    return try {
      verify(host, session.peerCertificates[0] as X509Certificate)
    } catch (_: SSLException) {
      false
    }
  }

fun verify(host: String, certificate: X509Certificate): Boolean {
    return when {
      host.canParseAsIpAddress() -