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. Exemple :
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. La seconde étant beaucoup moins sécure, elle ne serait recommandée que pour une machine de test ou développement.
1. Ajouter le certificat au 'truststore' de Java du serveur où JMap est installé.
Plusieurs articles décrivent cette procédure. Exemple:
https://docs.oracle.com/javase/tutorial/security/toolsign/rstep2.html
https://docs.plm.automation.siemens.com/content/polarion/19.1/help/en_US/polarion_windows_installation/manually_updating_third_party_software/import_a_certificate_to_the_java_keystore.html
https://stackoverflow.com/questions/4325263/how-to-import-a-cer-certificate-into-a-java-keystore
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 seconde, 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.
Les dernières versions de JMap7 incluent une JVM directement installée avec JMap. Le certificat SSL doit donc être ajouté au truststore de cette JVM, localisée sous jmap/jre et le truststore à ajouter est \jmap\jre\lib\security\cacerts. Le 'keytool' requis pour cette opération est disponible sous jmap/jre/bin. Donc par exemple, depuis la racine de votre serveur JMap, pour un certificat 'mycert.cer' (certificat format X.509 en Base 64) à la racine de JMap et jmap sous d:/jmap, la command serait la suivante. Assurez-vous de lancer l'invite de commande en tant qu'administrator; clique droit sur l'icône, puis 'run as administrator'.
"jre/bin/keytool" -importcert -file mycert.cer -alias votreorganisationcertif -keystore jre/lib/security/cacerts -storepass changeit
Vous pouvez valider que le certificat a bien été ajouté avec la commande suivante. En l'exécutant avant et après, vous devriez voir le total incrémeter de 1. (ex; ce truststore contient 105 entrées puis par la suite 106.).
"jre/bin/keytool" -list -keystore jre\lib\security\cacerts -storepass changeit
À noter que cette procédure devra probablement être répétée après une mise à jour de JMap puisque JMap mettra possiblement la version de Java à jour et ces changements pourraient être perdus, donc prendre note de la commande.
Si vous voulez ajouter un certificat qui n'est pas le votre, vous pouvez télécharger en vous connectant à l'aide d'un navigateur web par HTTPS au site en question, cliquer sur le petit cadenas à gauche de l'URL puis par exemple avec google chrome; cliquer sur 'certificat', 'détails', puis 'copier dans fichier'. Le certificat pourra être utilisé dans l'étape ci-dessus. Assurez-vous que le site soit bien digne de confiance par contre...
2. Configurer JMap pour qu'il accepte tous les certificats HTTPS même s'il ne peut pas les valider.
(non recommandée)
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. Cette configuration ne serait donc pas recommandée pour un serveur de production.
- 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.
Anchor | ||||
---|---|---|---|---|
|
English version
Problem
When JMap/Java tries to connect to a site using HTTPS, an error message is displayed stating that the SSL certificate is invalid, ex. Example:
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
The message may be displayed even though the SSL certificate has been installed in the JVM Keystore.
This problem can be caused by a certificate of self-signed type, invalid, or a certificate provider not recognized by Java. As of the writing date of this article, only 93 certificate providers are recognized by Java (https://community.letsencrypt.org/t/will-the-cross-root-cover-trust-by-the-default-list-in-the-jdk-jre/134). A certificate could be valid but not recognized by JMap/Java.
Solution:Allow JMap/Java to use a certificate
Two solutions are available:
1. Configure JMap to accept all HTTPS certificates even if it cannot validate them.
With this configuration, JMap will accept all certificates even if it cannot validate them. This poses a security risk, for example if a site to which JMap Server was connected was compromised, a third party could possibly intercept the information.
- Add these lines to the file bin/startjmapserver.vmoptions:
-Dconnection.ssl.untrusted.allow=true
-Dconnection.ssl.hostname.verify=false - Restart JMap Server.
The latest JMap7 include a JVM directly installed in the JMap server directory. The SSL certificate must then be added to the truststore of this JVM located in the directory jmap/jre. The target truststore is \jmap\jre\lib\security\cacerts. The 'keytool' executable required for this operation is available under jmap/jre/bin. So for example, for a certificate 'mycert.cer' (certificat format X.509 en Base 64) located in the root of the JMap, you could use the available command. (Make sure to launch the command prompt using 'run as administrator'):
"jre/bin/keytool" -importcert -file mycert.cer -alias votreorganisationcertif -keystore jre/lib/security/cacerts -storepass changeit
You can validate that the command was successful using by running this line before and after, and the total should be incremented by one. (Ex: 105 contained in this truststore and after 106).
"jre/bin/keytool" -list -keystore jre\lib\security\cacerts -storepass changeit
Please note that this change might be lost when updating JMap, so the steps should be written down so that they can be easily repeated if necessary.
If you do not have the certificate, you can likely downloading by using a web browser, opening the HTTPS website, clicking on the little lock on the left of the URL. In google chrome for instance, you would click on 'certificate', 'details', then 'copy to file'. The certificate could then be used for the above step. But make sure that the website is indeed to be trusted before doing so...
Solution: Allow JMap/Java to use a certificate
Two solutions are available, the second being less secure would not be recommended:
1. Add the certificate to the Java 'truststore' of the server where JMap is installed.
Several articles describe this procedure (ex .: http, example:
https://docs.oracle.com/javase/tutorial/security/toolsign/rstep2.html
https://docs.plm.automation.siemens.com/content/polarion/19.1/help/en_US/polarion_windows_installation/manually_updating_third_party_software/import_a_certificate_to_the_java_keystore.html
https://stackoverflow.com/questions/4325263/a/9619478). how-to-import-a-cer-certificate-into-a-java-keystore
This option adds an SSL certificate to the list of trusted Java certificates so that JMap can access the site as if Java had successfully validated the certificate itself. This option is therefore safer than the firstsecond, but this configuration is more complex and must be repeated for each of the SSL certificates not recognized or accepted by Java.
2. Configure JMap to accept all HTTPS certificates even if it cannot validate them.
With this configuration, JMap will accept all certificates even if it cannot validate them. This poses a security risk, for example if a site to which JMap Server was connected was compromised, a third party could possibly intercept the information. This configuration is therefore not recommended for a Production server.
- Add these lines to the file bin/startjmapserver.vmoptions:
-Dconnection.ssl.untrusted.allow=true
-Dconnection.ssl.hostname.verify=false - Restart JMap Server.
If the HTTP protocol is also available, it could be used but obviously this would be much less secure than the HTTPS protocol.