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();