SSL auth Postgre9.0

Проблемы с установкой, настройкой и работой системных и сетевых программ.

Модераторы: GRooVE, alexco

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
kharkov_max
капитан
Сообщения: 1862
Зарегистрирован: 2008-10-03 14:56:40

SSL auth Postgre9.0

Непрочитанное сообщение kharkov_max » 2011-12-09 16:39:53

Добрый день.

Решил попробовать прилепить авторизацию по ключам клиентов в PostgreSQL.

Код: Выделить всё

>uname -a
FreeBSD free9 9.0-PRERELEASE FreeBSD 9.0-PRERELEASE 

Код: Выделить всё

pkg_info | grep postgre
postgresql-client-9.1.2 PostgreSQL database (client)
postgresql-server-9.1.2 The most advanced open-source database available anywhere
По мере гугления данного вопроса и что б заново постоянно не писать одни и те же команды, в попытках сделать правильно, нарисовался следующий скрипт.
Скрипт создает корневой сертификат, подписывает ним сертификат сервера и создает сертификат пользователя pgsql.

Код: Выделить всё

#!/bin/sh
# Скрипт генерирует ключ для PostgreSQL server

# ----------------------------------------------------------------------------------------
# Создавать ли сертификат сервера yes/no
server_sert="yes"
# Создавать ли клиентские сертификаты yes/no
client_sert="yes"
# Использовать пароль при создании сертификатов
password="no"
srv="PostgreSQL_9.0"
user="pgsql"
user_server="pgsql"
user_server_group="pgsql"
email="root@localhost
valid_day_server="1200"
valid_day_client="1200"
bit_server=1024
bit_client=1024
server_data_folder="/usr/local/pgsql/data"
cert_root_dir="$server_data_folder/cert_server"
subject_server="/C=UA/ST=sity/L=sity/O=WorkGroup/OU=$srv/CN=$srv/emailAddress=$email"
subject_client="/C=UA/STsity/L=sity/O=WorkGroup/OU=$srv/CN=$user/emailAddress=$email"
# -----------------------------------------------------------------------------------------

# ------------------------ Server key -------------------------------------------------
if [ $server_sert = "yes" ]; then
    rm $server_data_folder/server.* $server_data_folder/root.*
    if [ $password = "yes" ]; then
	openssl genrsa -des3 -rand /dev/random -out $server_data_folder/root.key $bit_server
	else
	openssl genrsa -rand /dev/random -out $server_data_folder/root.key $bit_server
    fi
    openssl rsa -in $server_data_folder/root.key -out $server_data_folder/root.key
    openssl req -new -key $server_data_folder/root.key -days $valid_day_server -out $server_data_folder/root.crt \
            -x509 -subj $subject_server
    openssl req -new -newkey rsa:$bit_server -nodes -keyout $server_data_folder/server.key -subj $subject_server \
            -out $server_data_folder/server.csr
    openssl x509 -req -days $valid_day_server -in $server_data_folder/server.csr -signkey $server_data_folder/server.key \
            -out $server_data_folder/server.crt -CA $server_data_folder/root.crt -CAkey $server_data_folder/root.key -CAcreateserial
    chmod 400 $server_data_folder/server.*
    chown $user_server:$user_server_group $server_data_folder/server.*
# ---
    rm -rf $cert_root_dir
    mkdir $cert_root_dir $cert_root_dir/certs $cert_root_dir/crl $cert_root_dir/newcerts
    echo "01" > $cert_root_dir/crlnumber
    echo "01" > $cert_root_dir/serial
    touch $cert_root_dir/index.dat

    echo "
    [ ca ]
    default_ca	=CA_CLIENT

    [ CA_CLIENT ]
    dir			= $cert_root_dir		# Where everything is kept
    certs		= $cert_root_dir		# Where the issued certs are kept
    crl_dir		= $cert_root_dir		# Where the issued crl are kept
    database		= $cert_root_dir/index.dat	# database index file.
    #unique_subject	= no				# Set to 'no' to allow creation of
    							# several ctificates with same subject.
    new_certs_dir	= $cert_root_dir		# default place for new certs.

    certificate		= $cert_root_dir/root.crt	# The CA certificate
    serial		= $cert_root_dir/serial 	# The current serial number
    crlnumber		= $cert_root_dir/crlnumber	# the current crl number
    							# must be commented out to leave a V1 CRL
    crl			= $cert_root_dir/root.crl 	# The current CRL
    private_key		= $cert_root_dir/root.key 	# The private key
    RANDFILE		= /dev/random			# private random number file

    x509_extensions	= usr_cert			# The extentions to add to the cert

    default_days	= 365				# how long to certify for
    default_crl_days= 30				# how long before next CRL
    default_md	= sha1					# which md to use.
    preserve	= no					# keep passed DN ordering" > $cert_root_dir/ca.cnf

    cp $server_data_folder/root.crt $cert_root_dir/root.crt
    cp $server_data_folder/root.key $cert_root_dir
    openssl ca -config $cert_root_dir/ca.cnf -gencrl -out $cert_root_dir/root.crl > /dev/null 2>&1
    cp $cert_root_dir/root.crl $server_data_folder
fi

# ------------------------ Klient ----------------------------------------------------------
if [ $client_sert = "yes" ]; then
    rm $server_data_folder/$user.crt $server_data_folder/$user.csr $server_data_folder/$user.key
    if [ $password = "yes" ]; then
	openssl genrsa -des3 -rand /dev/random -out $server_data_folder/$user.key $bit_client
	else
	openssl genrsa -rand /dev/random -out $server_data_folder/$user.key $bit_client
    fi
    openssl rsa -in $server_data_folder/$user.key -out $server_data_folder/$user.key
    openssl req -new -key $server_data_folder/$user.key -days $valid_day_client -out $server_data_folder/$user.csr -subj $subject_client
    openssl x509 -req -days $valid_day_client -in $server_data_folder/$user.csr -signkey $server_data_folder/$user.key \
            -out $server_data_folder/$user.crt -CA $server_data_folder/root.crt -CAkey $server_data_folder/root.key -CAcreateserial

    chmod 400 $server_data_folder/$user.*
    chown $user_server:$user_server_group $server_data_folder/$user.*
fi
После исполнения скрипта в директории postgre создаются необходимые ключи и т.д.
После перезапуска postgrsqle в его логах нет ни какой ругани и сервер работает.

Далее проверяю работу ssl из Windows через Pgadmin 1.14
Если в файле pg_hba.conf
Указать так:

Код: Выделить всё

hostssl    all             all             192.168.0.0/24         md5
То клиент без клиентских сертификатов удачно подключается к серверу (по паролю md5).
Pgadmin рапортует о ssl защищенном соединении с сервером.

Если в файле pg_hba.conf
Указать так:

Код: Выделить всё

hostssl    all             all             192.168.0.0/24         cert
У казать сертификаты сгенерированные на сервере скриптом (root.crt, root.crl, pgsql.crt, pgsql.key) и попробовать подключится Pgadmin то вываливается ошибка проверки сертификата.

Вопросы:
1. Подскажите что я делаю не так?
2. Как проверить в freebsd клиентский сертификат?

Спасибо.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/




Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35462
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: SSL auth Postgre9.0

Непрочитанное сообщение Alex Keda » 2012-01-04 21:07:02

нифига не понял =(
Убей их всех! Бог потом рассортирует...

Аватара пользователя
kharkov_max
капитан
Сообщения: 1862
Зарегистрирован: 2008-10-03 14:56:40

Re: SSL auth Postgre9.0

Непрочитанное сообщение kharkov_max » 2012-01-05 7:48:58

Alex Keda писал(а):нифига не понял =(
)))

Суть вопроса проходить авторизацию на сервере postgresql через сертификаты.

Как я делаю сертификаты сервера и клиента я показал в скрипте.
Потом:
Далее проверяю работу ssl из Windows через Pgadmin 1.14
Если в файле pg_hba.conf
Указать так:

Код: Выделить всё

hostssl    all             all             192.168.0.0/24         md5 
То клиент без клиентских сертификатов удачно подключается к серверу (по паролю md5).
Pgadmin рапортует о ssl защищенном соединении с сервером.

Если в файле pg_hba.conf
Указать так:

Код: Выделить всё

Выделить всёhostssl    all             all             192.168.0.0/24         cert
У казать сертификаты сгенерированные на сервере скриптом (root.crt, root.crl, pgsql.crt, pgsql.key) и попробовать подключится Pgadmin то вываливается ошибка проверки сертификата.
Т.е. создавать ssl конект к серверу клиентом у меня получилось, а вот проходить авторизацию по ключам - нет ...