2016-01-08 35 views
17

Sto provando a connettermi al mio database postgres usando psycopg2 con sslmode = param 'richiesto'; tuttavia, ottengo il seguente erroreIl supporto Psycopg2 Python SSL non è compilato in

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

Heres un paio di dettagli sul mio sistema

  • Mac OS X El Capitan
  • Python 2.7
  • psycopg2 installato tramite pip
  • pitone installato tramite homebrew

Lei e è quello che ho cercato di fare per risolvere il problema

  • brew uninstall python
  • which python mostra ancora pitone vive in /usr/local/bin/python, provato a disinstallare questo, ma potevo. E sentito che questo è il pitone che il sistema operativo utilizza e non deve essere disinstallato in ogni modo
  • brew install python --with-brewed-openssl --build-from-source
  • pip uninstall psycopg2
  • pip install psycopg2

Dopo aver fatto tutto questo, l'eccezione accade ancora. Sto facendo funzionare questo script python tramite #!/usr/bin/env python Non sono sicuro se è importante, ma questa è una directory diversa da quella che which python mostra

+0

Nel database è stato compilato il supporto ssl richiesto? – hkBst

+0

Potete fornire l'output del comando 'pip install psycopg2'? Inoltre, quale versione di psycopg hai installato (visibile con 'pip list')? –

+0

@ andreas-hofmann 'pip install psycopg2' mostra' Requisito già soddisfatto (utilizzare --upgrade per l'aggiornamento): psycopg2 in/usr/local/lib/python2.7/site-packages'. Quando eseguo 'pip list' ottengo' psycopg2 (2.6.1) ' – user2158382

risposta

-4

tenta di installare psycopg2 da MacPorts

sudo port install py27-psycopg2 
+0

Perché downvote su MacPorts? –

6

Dal momento che si sta installando via pip , dovresti usare la versione più recente di psycopg2 (2.6.1). Dopo aver scavato un po 'nel codice, sembra che l'eccezione sia stata lanciata in connection_int.c, che chiama direttamente le librerie postgresql-c per configurare la connessione db. La chiamata avviene in questo modo:

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; 
} 

Le parole chiave che sono state specificate nella vostra dichiarazione connect a psycopg2.connect() sono affidate a tale funzione e gli errori vengono restituiti come un'eccezione OperationalError.

L'errore viene effettivamente generato direttamente nel postgresql-lib: è possibile verificare quale versione si sta utilizzando, come è stata creata e, se possibile, aggiornarla a una versione con supporto SSL o ricostruirla dall'origine con SSL abilitato.

PostgreSQL-documenti anche lo stato che manca supporto SSL genererà un errore, se lo sslmode è impostato richiedono, verificare-ca o verificare pieno. Vedere here sotto sslmode come riferimento.

Il postgres-website elenca diversi modi per installare Postgres dai pacchetti binari, quindi è possibile scegliere quello che si adatta alle proprie esigenze. Non ho familiarità con OSX, quindi non ho una raccomandazione su cosa è meglio.

This domanda può anche essere utile.

È inoltre necessario reinstallare il modulo psycopg2, accertarsi di utilizzare la libreria di nuova installazione durante la ricostruzione. Fare riferimento alla domanda collegata (in breve, sarà necessario posizionare il percorso su pg_config incluso nella nuova installazione su $ PATH quando è in esecuzione pip install psycopg2).

5

L'errore che si sta ricevendo è causato da un problema con Postgres stesso e non da psycopg2.

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

È possibile che questo indica che la versione di Postgres che psycopg2 è costruito contro non hanno il supporto SSL compilato. Quando si tenta di connettersi al server in esecuzione con Posgres ssl=require getta questo errore.

Tu non parlare di come è stato installato Postgres, ma dal momento che si sta utilizzando Homebrew per altre cose, vi consiglio di installare anche Postgres allo stesso modo:

$ brew update 
$ brew install postgresql 

Il formula for postgresql dimostra che dipende openssl e compila con il flag --with-openssl impostato. Installa inoltre le intestazioni necessarie libpq. Potrebbe essere necessario reinstallare psycopg2 dopo questo passaggio per assicurarsi che raccolga le librerie/versione corrette.

interessante notare che v'è un bug listed against conda che elenca lo stesso errore che si segnala che si verifica quando la versione Conda di psycopg2 - collegato in un sistema con Postgres Homebrew - è stato installato su un sistema senza, suggerendo le librerie SSL mancanti possono anche innescare questo.

Vorrei suggerire di disinstallare tutte le versioni di Postgres esistenti (comprese quelle installate tramite Homebrew) prima di reinstallarle per ridurre al minimo il rischio di utilizzare quello sbagliato.

3

Come altri hanno già detto, il messaggio di errore sembra provenire da Postgres. È possibile verificare questo digitando: psql sslmode=require se ti dà un terminale pgsql poi SSL funziona con Postgres, se gli errori allora non

cercare di eliminare Postgres e reinstallare con il supporto OpenSSL:

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

In alternativa, e questo è il modo in cui ti suggerisco, c'è un programma di installazione con un clic su http://postgresapp.com che potrebbe anche facilitare l'installazione. Seguire le istruzioni sul sito per installarlo correttamente.

Quando l'ho fatto su Yosemite installato in ~/Library/Application \ Support/Postgres93/var

Si potrà anche creare un certificato (questo potrebbe anche essere dove l'errore sta venendo) sia da un ufficiale di stato civile se questo sarà pubblicamente rivolto al minimo o autofirmato se si tratta di un ambiente di sviluppo/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 

Passare alla directory di configurazione, per impostazione predefinita è: ~/Library/Application \ Support/Postgres93/var

abilitare il supporto SSL:

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

riavviare l'applicazione e quindi controllare ssl con psql "sslmode=require"

Se funziona, provare con il codice Python. Se funziona con il codice sopra, ma non con Python, è sicuramente un problema di codice Python che deve essere risolto.

6

Ho avuto lo stesso errore, che si è verificato perché stavo usando la versione Anaconda di psycopg2. Per risolvere il problema, ho dovuto adattare VictorF's solution from here ed eseguire:

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 

Poi, quando si esegue conda list vedrete psycopg2 installato con <pip> nella colonna più a destra. Dopo ciò, ho appena riavviato Python e tutto ha funzionato.

1

Come non posso commentare:
Aggiungendo alla risposta di Brideau che questo ha funzionato solo per me dopo aver cambiato la mia versione di Postgres.

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

Quindi eseguire il codice fornito da Brideau e dovrebbe funzionare.

0

Se si utilizza v2.6.1 o v2.6.2 di psycopg2 (come me), la risposta è stata un semplice aggiornamento alla v2.7. Leggendo lo release notes per psycopg2, c'era una soluzione minore per SSL anche se non sembrava particolarmente rilevante.

mia messa a punto è stata la seguente:

  • Mac OS X El Capitan 10.11.6
  • psycopg2 2.6.2 installato tramite pip
  • PostgreSQL installati tramite Enterprise DB Installer

da corsa pip uninstall psycopg2 seguito da pip install psycopg2 risolto.