Utiliser l'authentification par certificat SSL pour JDBC et PostgreSql
Créer deux certificats pour le serveur PostgreSQL
Créer un répetoire pour sauvegarder les certificats
cd %UserProfile%\Desktop
mkdir certificat
Créer un certificat pour le serveur de base de données
Adresse du serveur: ::1
Mot de passe serveur: PostgreSql
Le mot de passe est retiré pour permettre à PostgreSql de démarrer sans avoir à saisir la clé
openssl genrsa -des3 -out server.key -passout pass:serveurPostgreSql 1024
openssl req -new -key server.key -out server.csr -subj "/CN=::1"
copy server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Créer un certificat auto-signé pour authentifier les certificats des clients SQL
Ici le certificat du serveur est utilisé comme certificat de confiance
Ce certificat peut être remplacé par un certificat de confiance signé par un tiers
copy server.crt root.crt
Copier les fichiers server.crt,server.key et root.crt dans le répertoire "Data" de PostgreSql.
Par exemple "C:\Program Files\PostgreSQL\9.3\data"
Créer un certificat pour le client
Certificat Client
Nom d'utilisateur (nom de l'utilisateur PostgreSql): utilisateurSSLCert
Mot de passe: client
openssl genrsa -des3 -out utilisateurSSLCert.key -passout pass:client 1024
openssl rsa -in utilisateurSSLCert.key -out utilisateurSSLCert.key -passin pass:client
openssl req -new -key utilisateurSSLCert.key -out utilisateurSSLCert.csr -subj "/CN=utilisateurSSLCert" -passin pass:client
openssl x509 -req -in utilisateurSSLCert.csr -CA root.crt -CAkey server.key -out utilisateurSSLCert.crt -CAcreateserial -days 365
Copier les fichiers utilisateurSSLCert.crt,utilisateurSSLCert.key et root.crt dans le répertoire
%appdata%/postgresql
Par exemple: C:\Users\florent.mazzone\AppData\Roaming\postgresql
Configurer PostgreSQL pour l'authentication par certificat
Ajouter un utilisateur à la base de données SQL.
Le nom de cet utilisateur doit être la valeur "CN" du certificat client
CREATE ROLE "utilisateurSSLCert" LOGIN NOSUPERUSER NOINHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
Activer SSL
Les propriétés suivantes doivent être activées dans postgresql.conf:
ssl = on # (change requires restart)
ssl_ca_file = 'root.crt'
La méthode d'authentification par certificat doit être configurée dans pg_hba.conf par l'ajout de la ligne suivante:
hostssl all all ::1/128 cert
Redémarrer le service PostgreSql
Tester l'authentification par certificat avec Psql
Connectez vous avec Psql pour tester l'authentification par certificat.
Par exemple:
"C:\Program Files\PostgreSQL\9.3\bin\psql.exe" "host=::1 port=5432 dbname=postgres user=utilisateurSSLCert sslmode=verify-full sslcert=utilisateurSSLCert.crt sslkey=utilisateurSSLCert.key sslrootcert=root.crt"
Le mode d'authentification SSL doit être affiché lors de la connexion:
Par exemple:
Connexion SSL (chiffrement : DHE-RSA-AES256-SHA, bits : 256)
Tester l'authentification par certificat avec JDBC
Créer une nouvelle bibliothèque de certificats contenant le certificat client et le certificat auto-signé créé précédemment pour authentifier le certificat serveur et les certificats clients. Le mot de passe de la bibliothèque doit être le même que celui du certificat client.
openssl pkcs12 -export -out utilisateurSSLCert.p12 -inkey utilisateurSSLCert.key -in utilisateurSSLCert.crt -certfile root.crt
"C:\Program Files\Java\jdk1.7.0_40\bin\keytool" -genkey -alias utilisateurSSLCert -keystore utilisateurSSLCert.jks -storepass client -keypass client -dname "CN=test"
"C:\Program Files\Java\jdk1.7.0_40\bin\keytool" -delete -alias utilisateurSSLCert -keystore utilisateurSSLCert.jks -storepass client
"C:\Program Files\Java\jdk1.7.0_40\bin\keytool" -import -trustcacerts -alias root -file root.crt -keystore utilisateurSSLCert.jks -storepass client
"C:\Program Files\Java\jdk1.7.0_40\bin\keytool" -v -importkeystore -srckeystore utilisateurSSLCert.p12 -srcstoretype PKCS12 -destkeystore utilisateurSSLCert.jks -storepass client -deststoretype JKS
Tester la connexion avec le code Java suivant:
//La configuration de la bibliothèque de certificats utilisées pour la connexion au serveur SQL
//peut également être effectuée lors de l'exécution du programme avec les commandes
//"-Djavax.net.ssl.keyStore" et "-Djavax.net.ssl.trustStore"
System.setProperty("javax.net.ssl.keyStore","utilisateurSSLCert.jks");
System.setProperty("javax.net.ssl.trustStore","utilisateurSSLCert.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "client");
String bibliothequeConfiance = System.getProperty("javax.net.ssl.trustStore");
String chaineConnexion = "jdbc:postgresql://[::1]/postgres?user=utilisateurSSLCert&ssl=true";
Connection connexionDb = DriverManager.getConnection(chaineConnexion);
Statement requete = connexionDb.createStatement();
requete.execute("SELECT version(),NOW()");
ResultSet resultSet = requete.getResultSet();
resultSet.next();
String pgServerVersion = resultSet.getString(1)+";"+resultSet.getString(2);
System.out.println(pgServerVersion);
resultSet.close();
requete.close();
connexionDb.close();