Я пытаюсь подключиться к моему серверу 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 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
Я неправильно выполняю процесс подписи сертификата клиента?
Спасибо,
#edit
Я пробовал:
openssl verify -CAfile root.crt -purpose sslclient client.crt
и я получаю:
client.crt: OK
Используя Wireshark, вот захват, который я получил для связи между клиентом (192.168.0.103) и сервером (192.168.0.100):
Вы знаете, как это понять?
#Edit 2
Хорошо, я сделал то, что вы сказали, и похоже, что сервер не отправляет клиенту сообщение CertificateRequest. Как вы можете видеть ниже:
но это странно, потому что в pg_hba.conf у меня есть:
hostssl all postgres 192.168.0.103/32 cert
Как вы думаете?
# Edit3 (SOLVED!)
Я изменил pg_hba.conf, чтобы он содержал:
hostssl all postgres 192.168.0.103/32 cert clientcert=1
и изменил postgresql.conf, чтобы добавить в раздел "Безопасность и аутентификация":
ssl_ca_file = 'root.crt'
И ЭТО РАБОТАЕТ! Большое вам спасибо!