Le développeur Java utilisant l’API java.net se retrouvera tôt ou tard confronté à un cas récurrent : l’accès à un service en SSL. Attention je ne parle pas uniquement de HTTPS mais de tous les protocoles ayant une déclinaison SSL : IMAPS, POP3S, SMTPS, LDAPS, … les cas ne manquent pas.
À partir de ce moment le développeur se trouve en face de 2 situations :
- Le serveur dispose d’une certificat à jour et émis par une autorité de certification connue par la JVM. Tout se passe normalement en utilisant la SSLSocketFactory fournit en standard.
- Le certificat du serveur distant ne répond pas à ces caractéristiques. Dans l’immense majorité des cas il s’agit de certificats auto-signés. À ce moment, l’API java.net vous refusera la connexion à ce serveur en lançant une SSLHandshakeException souvent noyée dans une pile d’exécution incompréhensible.
Pourquoi ce comportement? On touche là aux fondations de la signature numérique : la chaîne de confiance. Si un tiers n’est reconnu par aucun élément de la chaîne de confiance, l’identification est impossible. Dans notre cas d’utilisation cela se traduit par l’arrêt pur et simple des communications par l’API java.net.
Pourtant, le certificat auto-signé se justifie complètement dans certains cas d’utilisation, dans un environnement de développement par exemple. Pour faire face à ce problème, 2 méthodes s’offrent au développeur Java :
- Faire reconnaître à la JVM notre tiers en tant que tiers de confiance.
- Faire preuve de laxisme.
Mais si l’objectif recherché est le même, chacune des méthodes agit à des niveaux différents et présente à ce titre des caractérisques singulières qu’il faudra prendre en considération.
. . . → Lire la suite: Certificats auto-signé et communication SSL en Java