psql: FATAL: для подключения требуется действительный сертификат клиента

Я пытаюсь подключиться к моему серверу 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

после копирования необходимых файлов (клиент.ЭЛТ, клиент.ключ, корень.crt) на клиентскую машину и изменение разрешения (т. е. клиент chmod og-rwx.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

Я делаю процесс подписания сертификата клиента не так?

спасибо,

#Edit

пробовал:

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

а я:

client.crt: OK

используя Wireshark, вот захват, который я получил для связи между клиентом (192.168.0.103) и сервером (192.168.0.100):

enter image description here

вы знаете, как это понять?

#редактирование 2

хорошо, я сделал то, что вы сказали, и похоже, что сервер не отправляет сообщение CertificateRequest клиенту.. как вы можете видеть ниже:

enter image description here

но это странно, потому что в файле pg_hba.conf, у меня:

hostssl all             postgres        192.168.0.103/32        cert

что вы думаете?

#Edit3 (решено!)

Я изменил в файле pg_hba.conf, чтобы содержать:

hostssl all             postgres        192.168.0.103/32        cert clientcert=1

и изменен postgresql.conf для добавления в "безопасность и аутентификация" раздел:

ssl_ca_file = 'root.crt'

И ЭТО СРАБОТАЛО! Большое вам спасибо!

1 ответов


в этой ситуации я, как правило, вытаскиваю Wireshark и вынюхиваю переговоры SSL, чтобы убедиться, что сертификат клиента действительно предлагается клиентом.

Я предлагаю использовать openssl для проверки ссылки подписи клиента - >root.

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

редактировать: необходимо указать clientcert=1, даже если cert выбрана аутентификация. Да, это странно.