all:bibles:linux:applications:java
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédente | |||
| all:bibles:linux:applications:java [2025/04/14 16:32] – [Java Keystore] omeylhoc | all:bibles:linux:applications:java [2025/08/22 16:22] (Version actuelle) – [Validation] omeylhoc | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | ====== Java ====== | ||
| + | ---- | ||
| + | |||
| + | ===== Versions ===== | ||
| + | |||
| + | ==== Installation ==== | ||
| + | |||
| + | Pour installer manuellement une version (si pas disponible dans les dépôts). Après téléchargement de l' | ||
| + | |||
| + | === Mise en place === | ||
| + | |||
| + | <code bash> | ||
| + | tar zxvf < | ||
| + | sudo mv < | ||
| + | </ | ||
| + | |||
| + | === Prise en compte === | ||
| + | |||
| + | <code bash> | ||
| + | sudo update-alternatives --install / | ||
| + | sudo update-alternatives --install / | ||
| + | </ | ||
| + | |||
| + | === Choix de la version === | ||
| + | |||
| + | <code bash> | ||
| + | sudo update-alternatives --config java | ||
| + | sudo update-alternatives --config javac | ||
| + | </ | ||
| + | |||
| + | ==== Configuration ==== | ||
| + | |||
| + | <code bash> | ||
| + | sudo update-alternatives --config java | ||
| + | sudo update-alternatives --config javac | ||
| + | </ | ||
| + | |||
| + | ==== Interrogation ==== | ||
| + | |||
| + | <code bash> | ||
| + | update-alternatives --display java | ||
| + | update-alternatives --display javac | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Keystore / Truststore ===== | ||
| + | |||
| + | * Les fichiers Keystore et Truststore sont nécessaires dès que l'on veut communiquer de manière sécurisée en SSL/TLS. | ||
| + | * Le format par défaut de ces fichiers est JKS jusqu' | ||
| + | * Depuis Java 9 le format par défaut pour le keystore est PKCS12 qui est un format standardisé alors JKS est spécifique à Java. | ||
| + | |||
| + | ==== Java Keystore ==== | ||
| + | |||
| + | === Contenu === | ||
| + | |||
| + | Un keystore est un magasin qui contient des clés privées et les certificats associés ainsi que des certificats de serveurs. | ||
| + | |||
| + | === Utilisation === | ||
| + | |||
| + | Utilisé pour stocker les informations nécessaires à l' | ||
| + | En général on utilise un keystore en tant que serveur pour aller chercher une clef privée et présenter une clef publique correspondante et son certificat au client. | ||
| + | |||
| + | === Lister le contenu d'un keystore === | ||
| + | |||
| + | <code bash> | ||
| + | keytool -v -list -storetype jks -keystore < | ||
| + | </ | ||
| + | |||
| + | === Extraire le rootCA d'un keystore === | ||
| + | |||
| + | Après avoir identifié l' | ||
| + | |||
| + | <code bash> | ||
| + | keytool -exportcert -alias < | ||
| + | </ | ||
| + | |||
| + | === Vérifier le contenu du rootCA === | ||
| + | |||
| + | <code bash> | ||
| + | openssl x509 -in < | ||
| + | </ | ||
| + | |||
| + | ==== Java truststore ==== | ||
| + | |||
| + | === Contenu === | ||
| + | |||
| + | Contient uniquement des certificats de CA, pas de clés privées. | ||
| + | |||
| + | === Utilisation === | ||
| + | |||
| + | Utilisé pour vérifier les certificats présentés par d' | ||
| + | Typiquement utilisé par le client pour vérifier le certificat présenté par le serveur. | ||
| + | |||
| + | === Lister le contenu d'un trustore === | ||
| + | |||
| + | <code bash> | ||
| + | keytool -v -list -storetype jks -keystore < | ||
| + | </ | ||
| + | |||
| + | ==== Validation ==== | ||
| + | |||
| + | === Programme === | ||
| + | |||
| + | <code java CertificateValidator.java> | ||
| + | import javax.net.ssl.*; | ||
| + | import java.io.FileInputStream; | ||
| + | import java.io.IOException; | ||
| + | import java.net.URL; | ||
| + | import java.security.KeyStore; | ||
| + | import java.security.cert.Certificate; | ||
| + | import java.security.cert.X509Certificate; | ||
| + | import java.util.Date; | ||
| + | |||
| + | public class CertificateValidator { | ||
| + | |||
| + | public static void validateUrlWithKeystore(String urlStr, String keystorePath, | ||
| + | try { | ||
| + | // 1. Charger le keystore | ||
| + | KeyStore keystore = loadKeystore(keystorePath, | ||
| + | |||
| + | // 2. Configurer le contexte SSL | ||
| + | SSLContext sslContext = configureSSLContext(keystore); | ||
| + | |||
| + | // 3. Créer et configurer la connexion | ||
| + | HttpsURLConnection connection = createSecureConnection(urlStr, | ||
| + | |||
| + | // 4. Effectuer la validation | ||
| + | validateConnection(connection); | ||
| + | |||
| + | } catch (Exception e) { | ||
| + | System.err.println(" | ||
| + | e.printStackTrace(); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | private static KeyStore loadKeystore(String keystorePath, | ||
| + | System.out.println(" | ||
| + | KeyStore keystore = KeyStore.getInstance(" | ||
| + | try (FileInputStream fis = new FileInputStream(keystorePath)) { | ||
| + | keystore.load(fis, | ||
| + | System.out.println(" | ||
| + | return keystore; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | private static SSLContext configureSSLContext(KeyStore keystore) throws Exception { | ||
| + | TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); | ||
| + | tmf.init(keystore); | ||
| + | |||
| + | SSLContext sslContext = SSLContext.getInstance(" | ||
| + | sslContext.init(null, | ||
| + | return sslContext; | ||
| + | } | ||
| + | |||
| + | private static HttpsURLConnection createSecureConnection(String urlStr, SSLContext sslContext) | ||
| + | throws IOException { | ||
| + | URL url = new URL(urlStr); | ||
| + | HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); | ||
| + | connection.setSSLSocketFactory(sslContext.getSocketFactory()); | ||
| + | |||
| + | // Configuration du HostnameVerifier personnalisé | ||
| + | connection.setHostnameVerifier((hostname, | ||
| + | System.out.println(" | ||
| + | try { | ||
| + | Certificate[] certs = session.getPeerCertificates(); | ||
| + | printCertificateInfo(certs); | ||
| + | return true; | ||
| + | } catch (SSLPeerUnverifiedException e) { | ||
| + | System.err.println(" | ||
| + | return false; | ||
| + | } | ||
| + | }); | ||
| + | |||
| + | return connection; | ||
| + | } | ||
| + | |||
| + | private static void validateConnection(HttpsURLConnection connection) { | ||
| + | try { | ||
| + | System.out.println(" | ||
| + | |||
| + | // Effectuer la connexion | ||
| + | connection.connect(); | ||
| + | |||
| + | // Récupérer et afficher les informations des certificats | ||
| + | Certificate[] serverCerts = connection.getServerCertificates(); | ||
| + | |||
| + | System.out.println(" | ||
| + | System.out.println(" | ||
| + | printCertificateInfo(serverCerts); | ||
| + | |||
| + | // Vérifier le code de réponse HTTP | ||
| + | int responseCode = connection.getResponseCode(); | ||
| + | System.out.println(" | ||
| + | |||
| + | } catch (SSLHandshakeException e) { | ||
| + | System.err.println(" | ||
| + | System.err.println(" | ||
| + | } catch (Exception e) { | ||
| + | System.err.println(" | ||
| + | } finally { | ||
| + | connection.disconnect(); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | private static void printCertificateInfo(Certificate[] certs) { | ||
| + | for (int i = 0; i < certs.length; | ||
| + | if (certs[i] instanceof X509Certificate) { | ||
| + | X509Certificate cert = (X509Certificate) certs[i]; | ||
| + | System.out.println(" | ||
| + | System.out.println(" | ||
| + | System.out.println(" | ||
| + | System.out.println(" | ||
| + | System.out.println(" | ||
| + | System.out.println(" | ||
| + | |||
| + | // Vérifier si le certificat est expiré | ||
| + | Date now = new Date(); | ||
| + | if (now.after(cert.getNotAfter())) { | ||
| + | System.out.println(" | ||
| + | } else if (now.before(cert.getNotBefore())) { | ||
| + | System.out.println(" | ||
| + | } else { | ||
| + | System.out.println(" | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | public static void main(String[] args) { | ||
| + | // Exemple d' | ||
| + | if (args.length != 3) { | ||
| + | System.out.println(" | ||
| + | System.out.println(" | ||
| + | return; | ||
| + | } | ||
| + | |||
| + | String url = args[0]; | ||
| + | String keystorePath = args[1]; | ||
| + | String keystorePassword = args[2]; | ||
| + | |||
| + | validateUrlWithKeystore(url, | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | === Fonctionnement=== | ||
| + | |||
| + | * Charge le keystore | ||
| + | * Configure un contexte SSL avec les certificats du keystore | ||
| + | * Établit une connexion HTTPS avec l'URL | ||
| + | * Vérifie la chaîne de certificats | ||
| + | * Affiche les informations détaillées des certificats | ||
| + | |||
| + | === Compilation === | ||
| + | |||
| + | <code bash> | ||
| + | sudo dnf install java-xx-openjdk-devel # redhat | ||
| + | sudo apt install default-jdk | ||
| + | javac CertificateValidator.java | ||
| + | </ | ||
| + | |||
| + | === Utilisation === | ||
| + | |||
| + | <code bash> | ||
| + | java CertificateValidator <url> < | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | [[all: | ||
