我试图连接到我的PostgreSQL服务器,但psql抱怨我没有有效的客户端证书.以下是我创建证书的方法:

自签名服务器证书:

openssl req -new -text -nodes -keyout server.key -out server.csr -subj '/C=US/ST=California/L=Fremont/O=Example/OU=CoreDev/CN=192.168.0.100' # CN is the server's IP address
openssl req -x509 -text -in server.csr -key server.key -out server.crt
cp server.crt root.crt
rm server.csr
chmod og-rwx server.key

客户端证书:

openssl req -new -nodes -keyout client.key -out client.csr -subj '/C=US/ST=California/L=Fremont/O=Example/OU=CoreDev/CN=postgres' # postgres is the database user name
openssl x509 -req -CAcreateserial -in client.csr -CA root.crt -CAkey server.key -out client.crt
rm client.csr

在将必要的文件(client.crt、client.key、root.crt)复制到客户机上并更改权限(即chmod og rwx client.key)后,我执行以下操作:

psql 'host=192.168.0.100 port=5432 dbname=postgres user=postgres sslmode=verify-full sslcert=client.crt sslkey=client.key sslrootcert=root.crt'

然后我得到:

psql: FATAL:  connection requires a valid client certificate

我是否在客户端证书签名过程中出错?

谢谢

#编辑

我试过:

openssl verify -CAfile root.crt -purpose sslclient client.crt

我得到:

client.crt: OK

以下是我使用Wireshark获得的客户端(192.168.0.103)和服务器(192.168.0.100)之间通信的捕获:

在此处输入图像描述

你知道怎么理解吗?

#编辑 2

好吧,我照你说的做了,服务器似乎没有向客户端发送CertificateRequest消息..如下所示:

在此处输入图像描述

但这很奇怪,因为在pg_hba中.嗯,我有:

hostssl all             postgres        192.168.0.103/32        cert

你怎么认为?

#编辑3 (SOLVED!)

我换了pg_hba.配置文件包含:

hostssl all             postgres        192.168.0.103/32        cert clientcert=1

改变了postgresql.要在"安全和身份验证"部分添加的配置:

ssl_ca_file = 'root.crt'

成功了!非常感谢!

推荐答案

在这种情况下,我倾向于拉出Wireshark并监听SSL协商,以确保客户机证书确实是由客户机提供的.

I suggest using openssl to verify the client->root signing link, too.

openssl verify -CAfile root.crt -purpose sslclient client.crt

Edit:即使 Select 了cert身份验证,也必须指定clientcert=1.是的,这很奇怪.

Postgresql相关问答推荐

PostgreSQL:`row_alias为null`且`row_alias不是null`返回值不一致

如何在 kubernetes 中安全地重启 postgresql 容器?

连接到 PostgreSQL 时没有属性执行错误

用于生产的 Rails 性能调优?

Rails Migration 使用转换将字符串转换为整数

PostgreSQL 在 mySQL 中的 date_trunc

PostgreSQL - jsonb_each

在postgres的同一列中存储不同数据类型的合理方法?

在 CentOS 上安装 psycopg2 时遇到问题

什么是 postgres 超级用户

如果 Column1 不为空,则按 Column1 排序,否则按 Column2 排序

SQL Select 一列中具有重复值的所有行

使用 pg-promise 插入多条记录

在 PostgreSQL 中跳过每 n 个结果行

POSTGRESQL 中的 CHARINDEX (SQL SERVER) 相似函数是什么?

Python PostgreSQL 模块.哪个最好?

PostgreSQL 中跨多个表的索引

PostgreSQL 中是否有类似 zip() 函数的东西,它结合了两个数组?

查询 JSON 列中的数组元素

如何为 adminpack 解决 PostgreSQL pgAdmin 错误Server instrumentation not installed?