2016-03-10 23 views
7

Tôi đang cố gắng kết nối với cơ sở dữ liệu Postgres từ xa với chế độ ssl = verify ca. Vấn đề của tôi có vẻ tương tự như Connect to Redshift via SSL using RConnect to Postgres via SSL using R, nhưng chúng không hoạt động đúng cách. Các lỗi luôn luôn làCách kết nối với PostgreSQL từ xa bằng R, xác thực chứng chỉ bắt buộc

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

Mã của tôi là một cái gì đó như thế này

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) 

Nó không phải là một vấn đề cơ sở dữ liệu chung mặc dù, bởi vì tôi có thể kết nối với db bằng Python. Cập nhật: Tôi đã nhầm lẫn khi chỉ định đường dẫn; lỗi thực sự là:

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

Trả lời

5

Theo thông báo lỗi, vấn đề là bạn đang chuyển giá trị rỗng cho tên người dùng và tên cơ sở dữ liệu. Điều đó cho thấy mã thực tế của bạn không khớp với những gì bạn đã nhập ở đây. Tôi sẽ viết 10 dòng chương trình Rscript mà chỉ kết nối và lấy một bit dữ liệu, như thế này:

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

Vì vậy, tôi không nghĩ rằng đây có liên quan đến Certs SSL ở tất cả, nhưng thực tế là các biến của bạn không được thiết lập theo cách bạn nghĩ.

EDIT: Tôi đã tạo CA của riêng mình và sử dụng nó để ký chứng chỉ máy chủ và chứng chỉ ứng dụng khách. Tôi đặt Postgres 9.3 trên một máy ảo mới và có các kết nối đang hoạt động, với các chứng chỉ cần thiết trên cả hai mặt. Tôi có thể kết nối với cả psql và R. Vì vậy, tôi sợ rằng tôi không thể tái tạo vấn đề của bạn. Nhưng một số điều có vẻ đáng ngờ trong mã của bạn:

  • Bạn chỉ cần một dấu gạch chéo ở phía trước chứ không phải hai. (Nếu bạn đang sử dụng những dấu xồ nguợc bạn cần hai.)
  • Bạn cần một không gian trước khi sslmode, như thế này:

    'sslcert=pem.crt', ' ', 
    

    không này:

    'sslcert=pem.crt', 
    

Thực hiện một trong những thay đổi đó khắc phục được sự cố của bạn?

+0

Nếu tôi chỉ thả tất cả các chứng chỉ SSL và chạy mã trên, đây là lỗi: 'Lỗi trong postgresqlNewConnection (drv, ...): Trình điều khiển RS-DBI: (không thể kết nối pep @ datadb1 trên dbname "test" ) '. Tôi nghĩ rằng tôi đọc ở đâu đó rằng RPostgreSQL không hỗ trợ kết nối SSL, vì vậy tôi có thể phải chuyển đổi hoàn toàn thư viện – Pep

+0

Được rồi, đã chỉnh sửa câu trả lời để thử thêm một vài thứ. –

+0

Cảm ơn bạn đã trải qua những khó khăn trong việc thiết lập nó và cho sự kiên nhẫn của bạn. Tôi đã làm hai điểm bạn đề cập, nhưng vẫn còn đưa ra cùng một lỗi. Tôi đã hỏi một vài người để kiểm tra nó trong trường hợp tôi đang thiếu sth, nhưng không có. Tôi đang nghĩ về một cách để tạo ra một ví dụ có thể tái tạo, nhưng tôi không thể nghĩ ra bất kỳ lúc nào – Pep

Các vấn đề liên quan