web-dev-qa-db-fra.com

Le support SSL Psycopg2 Python n’est pas compilé dans

J'essaie de me connecter à ma base de données postgres en utilisant psycopg2 avec sslmode = 'required' param; cependant, j'obtiens l'erreur suivante

psycopg2.OperationalError: sslmode value "require" invalid when SSL support is not compiled in

Voici quelques détails sur mon système

  • Mac OS X El Capitan
  • Python 2.7
  • Psycopg2 installé via pip
  • Python installé via homebrew

Voici ce que j'ai essayé de faire pour résoudre le problème

  • brew uninstall python
  • which python montre toujours python vivant dans /usr/local/bin/python, a essayé de désinstaller ceci mais n'a pas pu. Et entendu que c’est le python que le système d’exploitation utilise et ne doit pas être désinstallé de toute façon
  • brew install python --with-brewed-openssl --build-from-source
  • pip uninstall psycopg2
  • pip install psycopg2

Après avoir fait tout cela, l'exception se produit toujours. J'exécute ce script python via #!/usr/bin/env python Je ne sais pas si c'est important, mais il s'agit d'un répertoire différent de celui indiqué par which python.

17
user2158382

Comme vous installez via pip, vous devriez utiliser la version la plus récente de psycopg2 (2.6.1) . Après avoir fouillé dans le code, il semble que l’exception soit lancée dans connection_int.c, qui directement appelle les bibliothèques postgresql-c pour configurer la connexion à la base de données. L'appel se passe comme suit:

self->pgconn = pgconn = PQconnectStart(self->dsn);

Dprintf("conn_connect: new postgresql connection at %p", pgconn);

if (pgconn == NULL)
{
    Dprintf("conn_connect: PQconnectStart(%s) FAILED", self->dsn);
    PyErr_SetString(OperationalError, "PQconnectStart() failed");
    return -1;
}
else if (PQstatus(pgconn) == CONNECTION_BAD)
{
    Dprintf("conn_connect: PQconnectdb(%s) returned BAD", self->dsn);
    PyErr_SetString(OperationalError, PQerrorMessage(pgconn));
    return -1;
}

Les mots-clés spécifiés dans votre instruction de connexion à psycopg2.connect () sont gérés par cette fonction et les erreurs sont renvoyées sous la forme d'une exception OperationalError.

En réalité, l'erreur est générée directement dans postgresql-lib. Vous pouvez vérifier quelle version vous utilisez, comment elle a été construite et, si possible, la mettre à niveau vers une version prenant en charge SSL ou la reconstruire à partir de la source si SSL est activé.

Les publications postgresql-docs indiquent également que l'absence de prise en charge de SSL déclenchera une erreur si sslmode est défini sur require, verify-ca ou verify-full. Voir ici sous sslmode pour référence.

Le postgres-website répertorie plusieurs manières d'installer postgres à partir de paquets binaires. Vous pouvez donc choisir celle qui convient à vos besoins. Je ne suis pas familier avec OSX, je n'ai donc pas de recommandation.

_ { This } _ question peut également être utile.

Vous devez également réinstaller le module psycopg2. Assurez-vous d’utiliser la bibliothèque nouvellement installée lors de sa reconstruction. Reportez-vous à la question liée (en bref, vous devrez placer le chemin d'accès à pg_config inclus dans votre nouvelle installation vers $ PATH lors de l'exécution de pip install psycopg2).

6
andreas-hofmann

J'ai eu cette même erreur, qui s'est avérée être parce que j'utilisais la version Anaconda de psycopg2. Pour résoudre ce problème, je devais adapter la solution de VictorF d'ici et exécuter:

conda uninstall psycopg2
Sudo ln -s /Users/YOURUSERNAME/anaconda/lib/libssl.1.0.0.dylib /usr/local/lib
Sudo ln -s /Users/YOURUSERNAME/anaconda/lib/libcrypto.1.0.0.dylib /usr/local/lib
pip install psycopg2

Ensuite, lorsque vous exécuterez conda list, vous verrez que psycopg2 est installé avec <pip> dans la colonne de droite. Après cela, je viens de redémarrer Python et tout a fonctionné.

6
Brideau

L'erreur que vous recevez est due à un problème avec Postgres et non à psycopg2

psycopg2.OperationalError: sslmode value "require" invalid when SSL support is not compiled in

Ce qui précède indique que la version de Postgres sur laquelle psycopg2 est construit ne prend pas en charge le support SSL. Lorsque vous essayez de vous connecter au serveur Posgres en cours d'exécution avec ssl=require, cette erreur est générée.

Vous ne mentionnez pas comment vous avez installé Postgres, mais comme vous utilisez Homebrew pour d’autres fonctions, je vous recommande d’installer également Postgres de la même manière:

$ brew update
$ brew install postgresql

La formule pour postgresql montre qu'elle dépend de openssl et est compilée avec le fanion --with-openssl défini. Il installera également les en-têtes libpq nécessaires. Vous devrez peut-être réinstaller psycopg2 après cette étape pour vous assurer qu'il sélectionne les bibliothèques/versions correctes.

Fait intéressant, il existe un bogue répertorié dans conda qui répertorie la même erreur que celle que vous avez signalée lorsque la version conda de psycopg2 - liée sur un système avec Homebrew postgres - a été installée sur un système sans, déclencher cela. 

Je suggérerais de désinstaller toutes les versions existantes de Postgres (y compris celles installées via Homebrew) avant de les réinstaller afin de minimiser les risques d'utilisation de la mauvaise.

5
mfitzp

Comme d'autres l'ont dit, le message d'erreur semble provenir de Postgres. Vous pouvez le vérifier en tapant: psql sslmode=require s'il vous donne un terminal pgsql alors que ssl fonctionne avec postgres, si cela ne fonctionne pas correctement

Essayez de supprimer postgres et réinstallez-le avec le support openssl:

brew uninstall postgres
brew update
brew install postgres --with-openssl

Alternativement, et c'est ce que je suggérerais, il existe un programme d'installation en un clic à http://postgresapp.com qui pourrait également faciliter son installation. Suivez les instructions du site pour l’installer correctement.

Quand je l'ai fait sur Yosemite, il a été installé dans ~/Bibliothèque/Application\Support/Postgres93/var.

Vous voudrez également créer un certificat (cela pourrait aussi être l’origine de l’erreur) soit d’un bureau d’enregistrement s’il est destiné au public, soit auto-signé s’il s’agit d’un environnement de développement/test.

openssl req -new -text -out server.req
openssl rsa -in privkey.pem -out server.key
rm privkey.pem
openssl req -x509 -in server.req -text -key server.key -out server.crt
chmod og-rwx server.key

Accédez à votre répertoire de configuration. Par défaut, il s’agit de: ~/Library/Application\Support/Postgres93/var

Activer le support ssl:

vim postgresql.conf
# change this:
# ssl = on
# to this:
ssl = on

Redémarrez l'application puis vérifiez ssl avec psql "sslmode=require"

Si cela fonctionne, essayez avec votre code Python. Si cela fonctionne avec le code ci-dessus, mais pas avec Python, alors c'est définitivement un problème de code Python qui doit être résolu.

3
Logan

Comme je ne peux pas commenter:
Ajoutant à la réponse de Brideau que cela ne fonctionnait pour moi qu'après avoir changé de version de Postgres. 

brew uninstall postgres
brew update
brew install postgres --with-openssl

Ensuite, lancez le code fourni par Brideau et cela devrait fonctionner. 

1
thenaturalist

Si vous utilisez v2.6.1 ou v2.6.2 de psycopg2 (comme moi), la réponse était une simple mise à niveau vers la v2.7. En lisant les notes de publication de psycopg2, il y avait une correction mineure pour SSL bien que cela ne semble pas particulièrement pertinent.

Ma configuration était la suivante:

  • Mac OS X El Capitan 10.11.6
  • psycopg2 2.6.2 installé via pip
  • PostgreSQL installé via le programme d'installation Enterprise DB

Exécuter pip uninstall psycopg2 suivi de pip install psycopg2 a résolu les problèmes. 

0
Andy G