5 votes

ssl sur postgres

J'essaie de configurer mon serveur postgres pour qu'il puisse établir des connexions ssl. J'ai configuré correctement les fichiers postgresql.conf et pg_hba.conf. J'ai créé une clé et un certificat auto-signé (server.crt et server.key) dans le répertoire de données postgres et copié le server.crt dans le root.crt.

J'ai également configuré un certificat et une clé sur un autre hôte en utilisant le root.crt du serveur pour signer le certificat du client. Lorsque j'utilise openssl pour tester le certificat, tout va bien. Cependant, lorsque j'essaie de me connecter au serveur postgres, cela échoue :

psql -h <HOSTNAME> -U <USER> -d <DB>
psql: SSL error: certificate verify failed

Alternativement :

openssl s_client -connect <HOSTNAME>:5432 -state -msg -showcerts -debug
CONNECTED(00000003)
SSL_connect:before/connect initialization
write to 080ACFE0 [080AD570] (145 bytes => 145 (0x91))
0000 - 80 8f 01 03 01 00 66 00-00 00 20 00 00 39 00 00   ......f... ..9..
...
0080 - 04 fd be bd 49 e7 1d 99-f5 bb 7e 24 2e fe 34 e8   ....I.....~$..4.
0090 - d7                                                .
>>> SSL 2.0 [length 008f], CLIENT-HELLO
    01 03 01 00 66 00 00 00 20 00 00 39 00 00 38 00
    ...
    be bd 49 e7 1d 99 f5 bb 7e 24 2e fe 34 e8 d7
SSL_connect:SSLv2/v3 write client hello A
read from 080ACFE0 [080B2AD0] (7 bytes => 0 (0x0))
18357:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:226:

Enfin, si je configure openssl pour servir du côté serveur et me connecter à partir de l'hôte client, cela fonctionne bien :

openssl s_client -connect <HOSTNAME>:4433 -state -msg -showcerts -debug

Une idée de la raison pour laquelle Postgres refuse mes certificats ? Dans ma configuration actuelle, le serveur est FreeBSD 4.7 et utilise postgres 8.1, et le client est CentOS 4 et utilise postgres 9.0. Je ne suis pas sûr que cela joue un rôle ici...

0 votes

PostgreSQL version 8.1 est déjà en fin de vie. Envisagez une mise à jour vers une version plus récente, le support de SSL s'est également amélioré dans les versions ultérieures. La version 9.0 est un bon candidat, vous utilisez déjà le client psql.

0 votes

Oui, nous configurons notre ancien serveur pour qu'il soit répliqué sur le nouveau (9.0) via Slony. Nous configurons SSL pour ces connexions.

5voto

sundar Points 2271

PostgreSQL ne commence pas la négociation SSL avant que vous n'ayez envoyé un paquet lui ordonnant de le faire. s_client s'attend à ce qu'il fasse SSL avant ce paquet. Voir http://www.postgresql.org/docs/9.0/static/protocol-flow.html#AEN84524 pour la documentation sur le fonctionnement de SSL dans PostgreSQL.

Vérifiez que votre certificat racine se trouve au bon endroit sur le client et qu'il est lisible par postgres. Peut-être au point d'exécuter strace pour s'assurer qu'il est effectivement lu. C'est de loin la raison la plus courante pour laquelle les choses ne fonctionnent pas.

Et comme cela a déjà été dit, vous devriez abandonner la version 8.1 dès que possible, car elle est déjà en fin de vie. Mais cela ne devrait pas avoir d'effet majeur sur ce point.

3voto

foudfou Points 131

La suppression de mon ancien ~/.postgresql a résolu le problème pour moi. Essayez de strace psql pour vérifier open appels.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X