2016-03-10 10 views
7

Sto provando a connettermi a un database Postgres remoto con la modalità ssl = verify ca. Il mio problema sembra essere simile a Connect to Redshift via SSL using R e Connect to Postgres via SSL using R, ma non funzionano correttamente. L'errore è sempreCome connettersi a PostgreSQL remoto con R, richiesta convalida del certificato

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

Il mio codice è qualcosa di simile

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) 

non è un problema generale di database, però, perché sono in grado di connettersi al db utilizzando Python. Aggiornamento: avevo commesso un errore nello specificare il percorso; l'errore è in realtà questo:

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

risposta

5

In base al messaggio di errore, il problema è che si passano valori vuoti per nome utente e nome del database. Ciò suggerisce che il tuo codice effettivo non corrisponde a quello che hai inserito qui. Vorrei scrivere un programma rscript 10-line che appena si connette e afferra un po 'di dati, in questo modo:

#!/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) 

Quindi non credo che questo è legato al certificati SSL a tutti, ma il fatto che le variabili non vengono impostati come pensi che siano.

EDIT: ho creato la mia CA e l'ho utilizzata per firmare un certificato del server e un certificato del cliente. Ho inserito Postgres 9.3 su una nuova VM e ho connessioni funzionanti, con certs richiesti su entrambi i lati. Posso connettermi sia con psql sia con R. Quindi temo di non riuscire a riprodurre il problema. Ma alcune cose sembrano sospette nel tuo codice:

  • Hai solo bisogno di una barra in avanti nei tuoi percorsi, non di due. (Se si sta utilizzando backslash avresti bisogno di due.)
  • È necessario uno spazio prima sslmode, in questo modo:

    'sslcert=pem.crt', ' ', 
    

    non questo:

    'sslcert=pem.crt', 
    

Eseguire una delle quelle modifiche risolvono il tuo problema?

+0

Se ho appena cadere tutti i certificati SSL ed eseguire il codice di cui sopra, questo è l'errore: 'Errore nella postgresqlNewConnection (DRV, ...): RS-DBI conducente: (non poteva collegare pep @ datadb1 su dbname "test" ) '. Penso di aver letto da qualche parte che RPostgreSQL non supporta connessioni SSL, quindi potrei dover cambiare completamente la libreria – Pep

+0

Ok, ho modificato la risposta per provare un paio di altre cose. –

+0

Grazie per aver passato la briga di metterlo su e per la tua pazienza. Ho fatto i due punti che hai menzionato, ma continuo a dare lo stesso errore. Ho chiesto ad un paio di persone di controllarlo nel caso in cui mi manchi, ma no. Sto pensando a un modo per fare un esempio riproducibile, ma non riesco a pensare a nessuno al momento – Pep