cd %UserProfile%\Desktop
mkdir certificat
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
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
Par exemple "C:\Program Files\PostgreSQL\9.3\data"
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
Le nom de cet utilisateur doit être la valeur "CN" du certificat client
CREATE ROLE "utilisateurSSLCert" LOGIN NOSUPERUSER NOINHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
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
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)
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();