在SSL模式下使用psql连接到PostgreSQL

在SSL模式下使用psql连接到PostgreSQL,postgresql,ssl,ssl-certificate,postgresql-8.4,Postgresql,Ssl,Ssl Certificate,Postgresql 8.4,我正在尝试为PostgreSQL server配置ssl证书。我已经在数据目录中创建了一个证书文件(server.crt)和密钥(server.key),并将参数SSL更新为“on”以启用安全连接 我只希望服务器在客户端通过服务器证书进行身份验证,而不需要服务器端客户端的真实性。我使用psql作为客户端来连接和执行命令 我正在使用PostgreSQL 8.4和Linux。我尝试使用下面的命令连接到启用SSL的服务器 psql "postgresql://localhost

我正在尝试为PostgreSQL server配置ssl证书。我已经在数据目录中创建了一个证书文件(server.crt)和密钥(server.key),并将参数SSL更新为“on”以启用安全连接

我只希望服务器在客户端通过服务器证书进行身份验证,而不需要服务器端客户端的真实性。我使用psql作为客户端来连接和执行命令

我正在使用PostgreSQL 8.4和Linux。我尝试使用下面的命令连接到启用SSL的服务器

       psql "postgresql://localhost:2345/postgres?sslmode=require"
但是我越来越

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

我做错了什么?我尝试连接到启用SSL模式的服务器的方式正确吗?只验证服务器而不验证客户端可以吗?

psql
9.2以下版本不接受此类似URL的选项语法

SSL的使用可以由命令行或环境变量上的
sslmode=value
选项驱动,但默认为
preference
,SSL连接将首先自动尝试,而不指定任何内容

带有conninfo字符串的示例(针对psql 8.4更新)

有关更多选项,请阅读

psql“sslmode=require host=localhost port=2345 dbname=postgres”--username=some\u user

根据,只有连接参数应该放在conninfo字符串中(这就是为什么在我们的示例中,-username不在该字符串中)

psql--set=sslmode=require-h localhost-p 2345-U thirunas\
-d postgres-f test_schema.ddl
安全连接到Azure托管Postgres数据库的另一个示例:

psql-h-p-U-d
并更新
/var/lib/pgsql/10/data/pg_hba.conf
,将auth方法更改为
cert
。有关详细信息,请查看以下链接:


发现以下选项可用于为自签名postgres实例提供所有文件

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

如果SSL模式下需要连接,您可以在CLI中使用以下命令提供所有信息:

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" 

在psql客户端v12上,我在psql客户端中找不到激活
sslmode=verifyfull
的选项

我最终使用了环境变量:

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

端口2345而不是默认的5432?是。这是已配置的端口。如果您希望连接能够防止MITM攻击,请使用
sslmode=verify full
,而不仅仅是
require
。我从这个链接获得了这个连接字符串语法。我也尝试过使用您的选项
psql-h localhost-p 2345-U thirunas-d postgres“sslmode=require”-f test\U schema.ddl
,但它显示
sql:warning:额外的命令行参数“sslmode=require”被忽略
@annonymous您是说您获得了9.2文档的语法,但同时您也在说您使用的是8.4版。您使用的内容在8.4文档中没有引用。请尝试放置“sslmode=require”“也是第一个论点。”布鲁诺:我搞错了。刚刚注意到文档中的版本差异。但在第一次辩论中,我还是得到了同样的警告
psql-h localhost“sslmode=require”-p 2345-U thirunas-d postgres-f test_schema.ddl
。警告
psql:Warning:extra命令行参数“sslmode=require”被忽略
@Wave&遇到此问题的其他人,使用conninfo字符串代替数据库名称(-d)。可以在-d选项后指定数据库名称,也可以作为命令行上的第一个非选项参数。因此-d postgres“sslmode=require”应该是psql[options]-d“dbname=postgres sslmode=require”[other options]或psql[options]“dbname=postgres sslmode=require”。您可以将许多其他选项移到conninfo字符串中。我最初也这么认为,但在重新阅读“连接到数据库”部分后,我采用另一种方法指定连接参数,该参数位于conninfo字符串中,而不是使用数据库名称。这种机制使您可以非常广泛地控制连接。也就是说,您可以在
conninfo
字符串中插入任何参数。但我也认为这些文件在这里也可以说得更清楚。这是不正确的
--set=sslmode=require
定义了一个在身份验证过程中根本不涉及的psql变量。它并没有强制SSL,我可以确认这并不像@DanielVérité指出的那样有效。使用具有不受信任证书的postgres服务器进行测试,并使用
--set=sslmode=verify full
不会出现问题。对于TLS auth,您还需要:
PGSSLCERT
PGSSLKEY
并删除
-W
这是Google Cloud推荐的方法,我可以确认它有效。资料来源:是的,它是有效的,当时谷歌没有这个建议,他们从我那里偷来的:D只是开玩笑)你是真正的MVP,谷歌plz给这个人一块饼干!❤
psql "host={hostname} sslmode=prefer sslrootcert={ca-cert.pem} sslcert={client-cert.pem} sslkey={client-key.pem} port={port} user={user} dbname={db}"
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" 
PGSSLMODE=verify-full PGSSLROOTCERT=server-ca.pem psql -h your_host -U your_user -W -d your_db