2016-03-10 15 views
7

Próbuję połączyć się ze zdalną bazą Postgres z trybem ssl = verify ca. Mój problem wydaje się podobny do Connect to Redshift via SSL using R i Connect to Postgres via SSL using R, ale nie działają one poprawnie. Błąd jest zawszeJak połączyć się ze zdalnym PostgreSQL-em z R, wymagane jest sprawdzenie poprawności certyfikatu

Error in postgresqlNewConnection(drv, ...) : RS-DBI driver: (could not connect (null)@datadb1 on dbname "(null)"

Mój kod jest coś takiego

library("RPostgreSQL") 
host = 'datadb1' 
dbname = 'test' 
port = 5432 
password = pw 
username = 'pep' 

pg_dsn = paste0(
    'dbname=', dbname, ' ', 
    'sslrootcert=', "C://root-ca.crt", ' ', 
    "sslkey=C://pep.key", " ", 
    "sslcert=C://pep.crt", 
    'sslmode=verify-ca' 
) 
dbConnect(RPostgreSQL::PostgreSQL(), dbname=pg_dsn, host=host, 
      port=port, password=password, user=username) 

nie jest to ogólny problem w bazie jednak, bo jestem w stanie połączyć się z db przy użyciu Pythona. Aktualizacja: Popełniłem błąd przy określaniu ścieżki; błąd jest następujący:

Error in postgresqlNewConnection(drv, ...) : RS-DBI driver: (could not connect [email protected] on dbname "test") 

Odpowiedz

5

Zgodnie z komunikatem o błędzie, problem polega na przekazywaniu pustych wartości nazwy użytkownika i bazy danych. To sugeruje, że Twój aktualny kod nie pasuje do tego, co tu wprowadziłeś. Chciałbym napisać 10-liniowy Rscript program, który po prostu łączy i chwyta trochę danych, na przykład:

#!/usr/bin/Rscript 

library("RPostgreSQL") 
host = '192.168.36.2' 
dbname = 'test' 
port = 5432 
password = 'secret' 
username = 'pep' 

pg_dsn = paste(
       'dbname=', dbname, ' ', 
       'sslrootcert=', 'rootCA.pem', ' ', 
       'sslkey=pem.key', ' ', 
       'sslcert=pem.crt', ' ', 
       'sslmode=verify-ca', 
       sep="" 
       ) 

conn <- dbConnect(RPostgreSQL::PostgreSQL(), dbname=pg_dsn, host=host, 
      port=port, password=password, user=username) 
rs <- dbSendQuery(conn, statement="SELECT COUNT(*) FROM users") 
data <- fetch(rs, n=1) 
dim(data) 

Więc nie sądzę, jest to związane z CERT SSL w ogóle, ale fakt, że zmienne nie są ustawione tak, jak myślisz, że są.

EDIT: Stworzyłem własny ośrodek CA i wykorzystałem go do podpisania certyfikatu serwera i certyfikatu klienta. Umieściłem PostgreSQL 9.3 na świeżej maszynie wirtualnej i mam działające połączenia, z wymaganymi certyfikatami po obu stronach. Mogę połączyć się z psql i R. Obawiam się więc, że nie mogę odtworzyć twojego problemu. Ale kilka rzeczy wygląda podejrzanie w twoim kodzie:

  • Potrzebujesz tylko jednego ukośnika na swoich ścieżkach, a nie dwóch. (Jeśli uzywasz backslashy że potrzebne są dwa).
  • Trzeba przestrzeń przed sslmode, tak:

    'sslcert=pem.crt', ' ', 
    

    nie tak:

    'sslcert=pem.crt', 
    

Wykonaj jedną z te zmiany naprawią twój problem?

+0

Gdybym tylko kropla wszystkich certyfikatów SSL i uruchomić powyższy kod, to jest błąd: 'Błąd w postgresqlNewConnection (DRV, ...): RS-DBI kierowca: (nie mógł połączyć pep @ datadb1 na dbname "test" ) '. Myślę, że czytałem gdzieś, że RPostgreSQL nie obsługuje połączeń SSL, więc może będę musiał całkowicie przełączyć bibliotekę – Pep

+0

Dobra, zredagowałem odpowiedź, by wypróbować jeszcze kilka rzeczy. –

+0

Dziękuję za trudność ustawienia i za cierpliwość. Zrobiłem dwa punkty, o których wspomniałeś, ale wciąż podajesz ten sam błąd. Poprosiłem kilka osób o sprawdzenie go na wypadek, gdyby mi brakowało czegoś, ale nie. Zastanawiam się nad sposobem na stworzenie powtarzalnego przykładu, ale nie mogę o tym myśleć w tej chwili. – Pep

Powiązane problemy