Sử dụng psql để kết nối với PostgreSQL ở chế độ SSL


77

Tôi đang cố gắng định cấu hình chứng chỉ ssl cho máy chủ PostgreSQL. Tôi đã tạo tệp chứng chỉ (server.crt) và khóa (server.key) trong thư mục dữ liệu và cập nhật tham số SSL thành "bật" để kích hoạt kết nối an toàn.

Tôi chỉ muốn máy chủ được xác thực bằng chứng chỉ máy chủ ở phía máy khách và không yêu cầu tính xác thực của máy khách ở phía máy chủ. Tôi đang sử dụng psql làm ứng dụng khách để kết nối và thực thi các lệnh.

Tôi đang sử dụng PostgreSQL 8.4 và Linux. Tôi đã thử với lệnh dưới đây để kết nối với máy chủ có bật SSL

       psql "postgresql://localhost:2345/postgres?sslmode=require"

nhưng tôi đang nhận được

       psql: invalid connection option "postgresql://localhost:2345/postgres?sslmode"

Điều gì đang làm sai ở đây? Cách tôi đang cố gắng kết nối với máy chủ có bật chế độ SSL có đúng không? Có ổn không khi chỉ xác thực máy chủ chứ không phải máy khách?


Dự định sử dụng cổng 2345 thay vì 5432 mặc định?
Erwin Brandstetter 24/12/12

Đúng. Đây là cổng được cấu hình.
Lolly 24/12/12

2
Nếu bạn muốn kết nối được bảo mật trước các cuộc tấn công MITM, hãy sử dụng sslmode=verify-full, không chỉ require.
Bruno

Câu trả lời:


111

psql dưới 9.2 không chấp nhận cú pháp giống URL này cho các tùy chọn.

Việc sử dụng SSL có thể được thúc đẩy bởi sslmode=valuetùy chọn trên dòng lệnh hoặc biến môi trường PGSSLMODE , nhưng mặc định prefer, các kết nối SSL sẽ được thử tự động đầu tiên mà không cần chỉ định bất kỳ điều gì.

Ví dụ với chuỗi conninfo ( được cập nhật cho psql 8.4 )

psql "sslmode=require host=localhost dbname=test"

Đọc trang hướng dẫn sử dụng để có thêm tùy chọn.


Tôi nhận cú pháp chuỗi kết nối này từ liên kết này. postgresql.org/docs/9.2/static/app-psql.html
Lolly

2
Tôi đã thử với lựa chọn của bạn quá psql -h localhost -p 2345 -U thirunas -d postgres "sslmode=require" -f test_schema.ddl nhưng nó nói sql: warning: extra command-line argument "sslmode=require" ignored
Lolly

@annonymous bạn đang nói rằng bạn có cú pháp cho tài liệu 9.2, nhưng bạn cũng nói rằng bạn đang sử dụng phiên bản 8.4. Những gì bạn đang sử dụng không được tham chiếu trong tài liệu 8.4. Cố gắng đặt "sslmode = request" làm đối số đầu tiên.
Bruno

1
@Bruno: Tôi đã nhầm. Chỉ cần nhận thấy sự khác biệt về phiên bản trong tài liệu. Nhưng vẫn có nó trong đối số đầu tiên, tôi nhận được cảnh báo tương tự. psql -h localhost "sslmode=require" -p 2345 -U thirunas -d postgres -f test_schema.ddl. Cảnh báopsql: warning: extra command-line argument "sslmode=require" ignored
Lolly 24/12/12

4
@Wave và những người khác gặp phải vấn đề này, chuỗi conninfo được sử dụng thay vì tên cơ sở dữ liệu (-d). Bạn có thể đặt tên cơ sở dữ liệu sau tùy chọn -d hoặc dưới dạng đối số không phải tùy chọn đầu tiên trên dòng lệnh. Vì vậy -d postgres "sslmode = request" phải là psql [options] -d "dbname = postgres sslmode = request" [other options] hoặc psql [options] "dbname = postgres sslmode = request". Bạn có thể di chuyển nhiều tùy chọn khác vào chuỗi conninfo.
jla

26
psql --set=sslmode=require -h localhost -p 2345 -U thirunas \
-d postgres -f test_schema.ddl

Một ví dụ khác để kết nối an toàn với cơ sở dữ liệu Postgres được quản lý của Azure:

psql --file=product_data.sql --host=hostname.postgres.database.azure.com --port=5432 \
--username=postgres@postgres-esprit --dbname=product_data \
--set=sslmode=verify-full --set=sslrootcert=/opt/ssl/BaltimoreCyberTrustRoot.crt.pem

3
Điều này là không chính xác. --set=sslmode=requirexác định một biến psql hoàn toàn không liên quan đến quá trình xác thực. Nó không có tác dụng gì để buộc SSL.
Daniel Vérité

6

Tìm thấy các tùy chọn sau hữu ích để cung cấp tất cả các tệp cho phiên bản postgres tự ký

psql "host={hostname} sslmode=prefer sslrootcert={ca-cert.pem} sslcert={client-cert.pem} sslkey={client-key.pem} port={port} user={user} dbname={db}"

3

Trên máy khách psql v12, tôi không thể tìm thấy tùy chọn trong máy khách psql để kích hoạt sslmode=verify-full.

Tôi đã sử dụng các biến môi trường:

PGSSLMODE=verify-full PGSSLROOTCERT=server-ca.pem psql -h your_host -U your_user -W -d your_db

1
cho TLS auth bạn cũng sẽ cần: PGSSLCERTPGSSLKEYvà thả-W
Paweł Prażak

2

psql "sslmode=require host=localhost port=2345 dbname=postgres" --username=some_user

Theo tài liệu psql postgres , chỉ các tham số kết nối mới nên đi trong chuỗi conninfo (đó là lý do tại sao trong ví dụ của chúng tôi, - tên người dùng không nằm trong chuỗi đó)


Ban đầu tôi cũng nghĩ điều này nhưng sau khi đọc lại phần Kết nối với cơ sở dữ liệu, tôi thực hiện Một cách thay thế để chỉ định các tham số kết nối là trong một chuỗi conninfo, được sử dụng thay cho tên cơ sở dữ liệu. Cơ chế này cho phép bạn kiểm soát rất rộng đối với kết nối. nghĩa là bạn có thể đẩy bất kỳ đối số nào trong conninfochuỗi. Nhưng tôi cũng nghĩ rằng tài liệu cũng có thể được làm rõ hơn ở đây.
Austin A


1

Vâng, đám mây của bạn cung cấp tất cả thông tin bằng lệnh sau trong CLI, nếu kết nối yêu cầu ở chế độ SSL:

psql "sslmode=verify-ca sslrootcert=server-ca.pem sslcert=client-cert.pem sslkey=client-key.pem hostaddr=your_host port=5432 user=your_user dbname=your_db" 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.