Heim >Java >javaLernprogramm >Wie behebe ich den Fehler „java.security.cert.CertificateException: Keine alternativen Betreffnamen vorhanden' beim Zugriff auf einen Webdienst über HTTPS?

Wie behebe ich den Fehler „java.security.cert.CertificateException: Keine alternativen Betreffnamen vorhanden' beim Zugriff auf einen Webdienst über HTTPS?

Linda Hamilton
Linda HamiltonOriginal
2024-11-08 02:31:02341Durchsuche

How do I fix the

Behebung des Fehlers „java.security.cert.CertificateException: Keine alternativen Betreffnamen vorhanden“

Beim Zugriff auf einen Webdienst über HTTPS mit Ein Java-Client, der auf den Fehler „java.security.cert.CertificateException: Keine alternativen Antragstellernamen vorhanden“ stößt, weist auf eine Nichtübereinstimmung zwischen dem Antragstellernamen des Zertifikats und der Hostadresse hin.

Um dieses Problem zu beheben, führen Sie die folgenden Schritte aus:

  1. Extrahieren Sie die Zertifikatsinformationen zwischen „-----BEGIN CERTIFICATE-----“ und „-----END CERTIFICATE-----“ aus der Ausgabe von „openssl s_client -showcerts -connect AAA.BBB.CCC.DDD:9443 -gt; certs.txt".
  2. Ändern Sie das extrahierte Zertifikat so, dass das Feld „Common Name (CN) des Betreffs) mit der IP-Adresse (AAA) übereinstimmt. BBB.CCC.DDD). Dies kann mit Tools wie den „x509“-Befehlen von OpenSSL erreicht werden.
  3. Importieren Sie das geänderte Zertifikat mit „keytool -importcert -file fileWithModifiedCertificate“.

Diese Methode ist jedoch möglicherweise nicht immer der Fall machbar, wenn Sie keine Kontrolle über das Serverzertifikat haben.

Eine alternative Lösung besteht darin, HTTPS-Prüfungen zu deaktivieren. Dieser Ansatz umfasst die Erstellung eines benutzerdefinierten Vertrauensmanagers und einer Hostnamenüberprüfung, die die Annahme aller Zertifikate ermöglichen. Fügen Sie in der Klasse „ISomeService“ den folgenden Code hinzu:

static {
    disableSslVerification();
}

private static void disableSslVerification() {
    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }
        public void checkClientTrusted(X509Certificate[] certs, String authType) {
        }
        public void checkServerTrusted(X509Certificate[] certs, String authType) {
        }
    }
    };

    // Install the all-trusting trust manager
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

    // Create all-trusting host name verifier
    HostnameVerifier allHostsValid = new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };

    // Install the all-trusting host verifier
    HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
}

Beachten Sie, dass das Deaktivieren von HTTPS-Prüfungen aus Sicherheitsgründen nicht für Produktionsumgebungen empfohlen wird.

Das obige ist der detaillierte Inhalt vonWie behebe ich den Fehler „java.security.cert.CertificateException: Keine alternativen Betreffnamen vorhanden' beim Zugriff auf einen Webdienst über HTTPS?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn