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
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çonbrew 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
.
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
).
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é.
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.
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.
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.
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:
Exécuter pip uninstall psycopg2
suivi de pip install psycopg2
a résolu les problèmes.