====== Java ======
----
===== Versions =====
==== Installation ====
Pour installer manuellement une version (si pas disponible dans les dépôts). Après téléchargement de l'archive :
=== Mise en place ===
tar zxvf .tar.gz
sudo mv /usr/lib/jvm
=== Prise en compte ===
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm//bin/java 1
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm//bin/javac 1
=== Choix de la version ===
sudo update-alternatives --config java
sudo update-alternatives --config javac
==== Configuration ====
sudo update-alternatives --config java
sudo update-alternatives --config javac
==== Interrogation ====
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'à Java 8.
* 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'identité d'une entité (par exemple, un serveur ou un client) pour la signature, le déchiffrement, etc.\\
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 ===
keytool -v -list -storetype jks -keystore
=== Extraire le rootCA d'un keystore ===
Après avoir identifié l'alias du rootCA à l'aide de la commande précédente :
keytool -exportcert -alias -file -keystore
=== Vérifier le contenu du rootCA ===
openssl x509 -in -text -noout
==== 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'autres entités, assurant que les communications sont sécurisées et de confiance.\\
Typiquement utilisé par le client pour vérifier le certificat présenté par le serveur.
=== Lister le contenu d'un trustore ===
keytool -v -list -storetype jks -keystore
==== Validation ====
=== Programme ===
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, String keystorePassword) {
try {
// 1. Charger le keystore
KeyStore keystore = loadKeystore(keystorePath, keystorePassword);
// 2. Configurer le contexte SSL
SSLContext sslContext = configureSSLContext(keystore);
// 3. Créer et configurer la connexion
HttpsURLConnection connection = createSecureConnection(urlStr, sslContext);
// 4. Effectuer la validation
validateConnection(connection);
} catch (Exception e) {
System.err.println("Erreur lors de la validation: " + e.getMessage());
e.printStackTrace();
}
}
private static KeyStore loadKeystore(String keystorePath, String keystorePassword) throws Exception {
System.out.println("Chargement du keystore: " + keystorePath);
KeyStore keystore = KeyStore.getInstance("JKS");
try (FileInputStream fis = new FileInputStream(keystorePath)) {
keystore.load(fis, keystorePassword.toCharArray());
System.out.println("Keystore chargé avec succès");
return keystore;
}
}
private static SSLContext configureSSLContext(KeyStore keystore) throws Exception {
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keystore);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), 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, session) -> {
System.out.println("\nVérification du hostname: " + hostname);
try {
Certificate[] certs = session.getPeerCertificates();
printCertificateInfo(certs);
return true;
} catch (SSLPeerUnverifiedException e) {
System.err.println("Erreur lors de la vérification du hostname: " + e.getMessage());
return false;
}
});
return connection;
}
private static void validateConnection(HttpsURLConnection connection) {
try {
System.out.println("\nTentative de connexion à: " + connection.getURL());
// Effectuer la connexion
connection.connect();
// Récupérer et afficher les informations des certificats
Certificate[] serverCerts = connection.getServerCertificates();
System.out.println("\nConnexion établie avec succès!");
System.out.println("Certificats du serveur:");
printCertificateInfo(serverCerts);
// Vérifier le code de réponse HTTP
int responseCode = connection.getResponseCode();
System.out.println("\nCode de réponse HTTP: " + responseCode);
} catch (SSLHandshakeException e) {
System.err.println("\nErreur SSL lors de la négociation: " + e.getMessage());
System.err.println("Vérifiez que le certificat est présent dans le keystore.");
} catch (Exception e) {
System.err.println("\nErreur lors de la validation: " + e.getMessage());
} finally {
connection.disconnect();
}
}
private static void printCertificateInfo(Certificate[] certs) {
for (int i = 0; i < certs.length; i++) {
if (certs[i] instanceof X509Certificate) {
X509Certificate cert = (X509Certificate) certs[i];
System.out.println("\nCertificat " + (i + 1) + ":");
System.out.println(" Sujet: " + cert.getSubjectX500Principal());
System.out.println(" Émetteur: " + cert.getIssuerX500Principal());
System.out.println(" Numéro de série: " + cert.getSerialNumber());
System.out.println(" Valide à partir de: " + cert.getNotBefore());
System.out.println(" Valide jusqu'au: " + cert.getNotAfter());
// Vérifier si le certificat est expiré
Date now = new Date();
if (now.after(cert.getNotAfter())) {
System.out.println(" ATTENTION: Ce certificat est expiré!");
} else if (now.before(cert.getNotBefore())) {
System.out.println(" ATTENTION: Ce certificat n'est pas encore valide!");
} else {
System.out.println(" État: Certificat valide");
}
}
}
}
public static void main(String[] args) {
// Exemple d'utilisation
if (args.length != 3) {
System.out.println("Usage: java CertificateValidator ");
System.out.println("Exemple: java CertificateValidator https://example.com /path/to/keystore.jks password");
return;
}
String url = args[0];
String keystorePath = args[1];
String keystorePassword = args[2];
validateUrlWithKeystore(url, keystorePath, keystorePassword);
}
}
=== 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 ===
sudo dnf install java-xx-openjdk-devel # redhat
sudo apt install default-jdk # ubuntu
javac CertificateValidator.java
=== Utilisation ===
java CertificateValidator
----
[[all:bibles:linux:applications:java|Haut de page]]