2012-02-02 19 views
10

Ho un'app in esecuzione sul mio server di produzione che utilizza la gemma pg per parlare con un database Postgres. Postgres è in esecuzione sulla porta predefinita e si trova dietro un firewall, quindi non è accessibile da qualsiasi cosa tranne localhost. Non ho configurato Postgres per fare nulla relativo a SSL.Errore Rails + PostgreSQL SSL decrittografia

Sto accedendo all'app Rails tramite SSL e il certificato è firmato per un altro dominio, quindi la prima volta che lo colpisci, viene presentato un errore di certificato ... ma questa è l'unica cosa correlata al protocollo SSL che è strano.

Eppure, sto vedendo questo modo intermittente nei miei ceppi Rails (accompagnato da un errore 500 nel browser quando capita):

Started GET "/admin/pages" for <xxx.xxx.xxx.xxx> at 2012-02-02 01:52:03 -0500 
Processing by PagesController#index as HTML 
Completed 500 Internal Server Error in 4ms 

ActiveRecord::StatementInvalid (PGError: SSL error: decryption failed or bad 
record mac 
: SELECT "pages".* FROM "pages"): 
    app/controllers/pages_controller.rb:36:in `index' 

Che diavolo?

risposta

12

Se il database è in esecuzione solo su localhost, disattivare SSL: non è molto utile crittografare una connessione locale. Impostare ssl=false in postgresql.conf (e riavviare il server db) o comunicare al client di non utilizzare SSL durante la connessione. Alcune installazioni configurano PostgreSQL per utilizzare SSL di default.

+0

Bello, grazie - sembra aver fatto il trucco! – codykrieger

+1

+1 - Grazie mille! Anche questo mi ha aiutato :-) –

+0

Per la cronaca: ho provato a risolvere questo problema disattivando la rinegoziazione SSL come proposto in altri thread, ma alla fine ho disattivato SSL solo come dichiarato da araqnid. Bummer perché volevo utilizzare il server di database per servire a distanza così :(Speriamo per una patch o un aggiornamento che risolve questo presto –

2

Se osservate i vostri registri di PostgreSQL dovreste trovare lo stesso errore. Si dovrebbe notare che per default, dopo l'installazione di PostgreSQL si avrà le seguenti righe nel tuo postgresql.conf:

ssl = true 
ssl_cert_file = '/etc/ssl/certs/ssl-cert-snakeoil.pem' 
ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key' 

La modifica di queste richiede di riavviare PostgreSQL, che non può essere una buona idea sul sistema di produzione, dal momento che interrompere il servizio.

Se si preferisce ricaricare postgresql, è possibile apportare modifiche allo pg_hba.conf invece: utilizzando la direttiva hostnossl.

Dal momento che si sta utilizzando la pg gemma, è possibile anche forzare la vostra applicazione per la connessione senza SSL, aggiungendo questa riga al vostro config/database.yml:

sslmode = disable 

In ogni caso, probabilmente si dovrebbe modificare la configurazione di PostgreSQL usare i certificati ssl corretti e non snakeoil, se hai mai bisogno di una connessione crittografata al tuo database.