2012-02-02 10 views
10

Mam uruchomioną aplikację na moim serwerze produkcyjnym, która używa klejnotu pg do rozmowy z bazą Postgres. Postgres działa na domyślnym porcie i znajduje się za firewallem, więc nie jest dostępny z niczego poza localhost. Nie skonfigurowałem PostgreSQL do zrobienia czegokolwiek związanego z SSL.Railsy + Deszyfrowanie SSL PostgreSQL

Mam dostęp do aplikacji Rails przez SSL, a certyfikat jest podpisany dla innej domeny, więc przy pierwszym jej trafieniu pojawia się błąd certyfikatu ... ale to jedyna rzecz związana z SSL, to dziwne.

A jednak, widzę to z przerwami w moich dziennikach Rails (towarzyszy 500 błędu w przeglądarce, kiedy to się dzieje):

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' 

Co do cholery?

Odpowiedz

12

Jeśli baza danych działa tylko na lokalnym hoście, wyłącz SSL: nie jest to naprawdę przydatne do szyfrowania połączenia lokalnego. Ustaw plik ssl=false w postgresql.conf (i zrestartuj serwer bazy danych) lub powiedz klientowi, aby nie używał SSL podczas nawiązywania połączenia. Niektóre instalacje konfigurują PostgreSQL do domyślnego używania SSL.

+0

Fajnie, dzięki - to chyba załatwiło sprawę! – codykrieger

+1

+1 - Wielkie dzięki! To mi też pomogło :-) –

+0

Dla przypomnienia: próbowałem to naprawić, wyłączając renegocjację SSL, jak proponowano w innych wątkach, ale w końcu wyłączałem tylko SSL, zgodnie z informacją podaną przez araqnid. Bummer, ponieważ chciałem również użyć serwera bazy danych do zdalnego wyświetlania :(Miejmy nadzieję na łatkę lub aktualizację, która wkrótce to naprawi. –

2

Jeśli spojrzysz na dzienniki PostgreSQL, powinieneś znaleźć ten sam błąd. Należy pamiętać, że domyślnie po instalacji PostgreSQL będzie mieć następujące linie w postgresql.conf:

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

Zmiana nich wymaga ponownego uruchomienia PostgreSQL, która nie może być dobrym pomysłem na systemie produkcyjnym, ponieważ będzie zakłócić swoją usługę.

Jeśli wolisz przeładować postgresql, możesz wprowadzić zmiany w pg_hba.conf zamiast: przy użyciu dyrektywy hostnossl.

Ponieważ używasz pg gem, można również wymusić swoją aplikację do łączenia bez ssl, dodając ten wiersz do config/database.yml:

sslmode = disable 

W każdym razie, powinieneś dostosować konfigurację postgresql używać odpowiednich certyfikatów ssl, a nie snakeoil, jeśli kiedykolwiek będziesz potrzebować szyfrowanego połączenia z bazą danych.