Problème
Lorsque JMap/Java essaie d'effectuer une connexion vers un site utilisant HTTPS, un message d'erreur s'affiche indiquant que le certificat SSL n'est pas valide, ex. :
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Il est possible que le message s'affiche même si le certificat SSL a été installé dans le JVM Keystore.
Ce problème peut être causé par un certificat de type self-signed, invalide, ou un fournisseur de certificat non-reconnu par Java. À la date d'écriture de cet article, seulement 93 fournisseurs de certificats sont reconnus par Java (https://community.letsencrypt.org/t/will-the-cross-root-cover-trust-by-the-default-list-in-the-jdk-jre/134). Un certificat pourrait donc être bien valide mais non reconnu par JMap/Java.
Solution : Autoriser JMap/Java à utiliser un certificat
Deux solutions sont possibles :
1. Configurer JMap pour qu'il accepte tous les certificats HTTPS même s'il ne peut pas les valider.
Avec cette configuration, JMap acceptera tous les certificats même s'il ne peut pas les valider. Ceci entraine donc un risque de sécurité, si par exemple un site auquel le serveur JMap se connectait était compromis, un tiers parti pourrait possiblement intercepter l'information.
- Ajouter ces deux lignes au fichier bin/startjmapserver.vmoptions :
-Dconnection.ssl.untrusted.allow=true
-Dconnection.ssl.hostname.verify=false - Rédemarrer JMap Server.
2. Ajouter le certificat au 'truststore' de Java du serveur où JMap est installé.
Plusieurs articles décrivent cette procédure (ex. : http://stackoverflow.com/a/9619478). Cette option permet d'ajouter un certificat SSL à la liste des certificats de confiance de Java de sorte à ce que JMap puisse accéder au site comme si Java avait réussi à valider lui-même le certificat. Cette option est donc plus sécuritaire que la première, mais cette configuration est plus complexe et doit être répétée pour chacun des certificats SSL non reconnus ou acceptés par Java.
Si le protocole HTTP est aussi disponible, il pourrait être utilisé mais évidemment ceci serait beaucoup moins sécuritaire que le protocole HTTPS.