Maison >Java >javaDidacticiel >Comment puis-je corriger l'erreur « java.security.cert.CertificateException : Aucun nom alternatif de sujet présent » lors de l'accès à un service Web via HTTPS ?

Comment puis-je corriger l'erreur « java.security.cert.CertificateException : Aucun nom alternatif de sujet présent » lors de l'accès à un service Web via HTTPS ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-08 02:31:02340parcourir

How do I fix the

Correction de l'erreur "java.security.cert.CertificateException : aucun nom alternatif de sujet présent"

Lors de l'accès à un service Web via HTTPS à l'aide un client Java rencontrant l'erreur « java.security.cert.CertificateException : Aucun nom alternatif de sujet présent » indique une incompatibilité entre le nom du sujet du certificat et l'adresse de l'hôte.

Pour résoudre ce problème, procédez comme suit :

  1. Extraire les informations de certificat entre "-----BEGIN CERTIFICATE-----" et "-----END CERTIFICATE-----" de la sortie de "openssl s_client -showcerts -connect AAA.BBB.CCC.DDD:9443 -gt; certs.txt".
  2. Modifiez le certificat extrait afin que le champ "Nom commun du sujet (CN)" corresponde à l'adresse IP (AAA. BBB.CCC.DDD). Ceci peut être réalisé à l'aide d'outils tels que les commandes "x509" d'OpenSSL.
  3. Importez le certificat modifié à l'aide de "keytool -importcert -file fileWithModifiedCertificate".

Cependant, cette méthode n'est pas toujours possible. faisable si vous n'avez pas de contrôle sur le certificat du serveur.

Une solution alternative consiste à désactiver les contrôles HTTPS. Cette approche implique la création d'un gestionnaire de confiance personnalisé et d'un vérificateur de nom d'hôte qui permettent d'accepter tous les certificats. Dans la classe "ISomeService", ajoutez le code suivant :

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);
}

Notez que la désactivation des vérifications HTTPS n'est pas recommandée pour les environnements de production en raison de problèmes de sécurité.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn