Проект

Общее

Профиль

Ssl-cc » История » Версия 1

Андрей Волков, 2016-11-10 15:10

1 1 Андрей Волков
h1. Подключение к postgres с обязательным использованием SSL и клиентского сертификата
2
3
h1. Дано
4
5
Cервера postgresql с адресами:
6
7
* *myserver1.example.com*
8
* *myserver2.example.com*
9
10
h1. Задача
11
12
Предоставить клиентам доступ к серверам через публичную сеть (Интернет).
13
14
- Включить шифрование канала между клиентом и сервером
15
- Требовать от клиента клиентский сертификат
16
- Требовать от клиента пароль
17
- Проверять, что сервер действительно то, за кого он себя выдает
18
19
h1. Решение
20
21
Данное решение реализовывалось на серверах postgresql-9.2+ и было актуально на 2016 год.
22
23
h2. 1. Генерация сертификатов
24
25
Если в вашем случае за настройку серверов и выдачу клиентских сертификатов отвечает один человек, то можно использовать одну CA для подписания, как клиентских так и серверных сертификатов.
26
27
Я рассмотрю вариант, когда CA отличаются
28
29
h3. 1.1. Генерация сертификатов серверов
30
31
Одним из вариантов решения могла бы быть покупка серверного сертификата
32
Но здесь это нецелесообразно, потому что клиенты не всегда используют системные ca-bundle, и раз уж нам все равно нужно передавать пользователям клиентские сертификаты, то передадим и CA сервера.
33
34
h4. 1.1.1. CA сертификат для подписания серверных сертификатов
35
36
Не буду вдаваться в подробности создания CA
37
38
*openssl genrsa -out server-ca.key -camellia256 2048*
39
*chmod 400 server-ca.key*
40
*openssl req -new -x509 -days 3650 -key server-ca.key -out server-ca.crt -subj '/C=RU/O=EKB-Info/CN=server-CA' -extensions v3_ca -sha256*
41
42
ШИфр для ключа *-camellia256* - дело вкуса.
43
Можно выбрать и что-то другое из:
44
45
 * -aes128
46
 * -aes192
47
 * -aes256
48
 * -camellia128
49
 * -camellia192
50
 * -camellia256
51
 * -des
52
 * -des3
53
 * -idea
54
55
Тип ЭЦП для сертификата *-sha256* - тоже дело вкуса.
56
По большому счету здесь можно использовать другой тип ЭЦП, т.к. на корневом сертификате ЭЦП не проверяется.
57
58
Значение параметра *-subj* нужно поправить под себя.
59
60
h4. 1.1.2 Создаем серверные сертификаты
61
62
h5. Создаем файл настроек для генерации серверного сертификата:
63
64
*cat > openssl.cnf*
65
66
<pre>
67
[ server ]
68
basicConstraints = CA:FALSE
69
extendedKeyUsage = serverAuth
70
subjectKeyIdentifier = hash
71
authorityKeyIdentifier = keyid,issuer:always
72
keyUsage = digitalSignature, keyEncipherment
73
</pre>
74
75
h5. Генерируем запросы на серверные сертификаты:
76
77
*openssl req -new -nodes -newkey rsa:2048 -keyout myserver1.example.com.key -out myserver1.example.com.csr -subj '/C=RU/O=EKB-Info/CN=myserver1.example.com/' -sha256*
78
*openssl req -new -nodes -newkey rsa:2048 -keyout myserver2.example.com.key -out myserver1.example.com.csr -subj '/C=RU/O=EKB-Info/CN=myserver2.example.com/' -sha256*
79
80
81
Здесь важно указать CN= в виде реального имени, по которому клиенты будут соединяться к серверу. Иначе не будет работать verify-full
82
https://www.postgresql.org/docs/9.5/static/libpq-ssl.html#LIBPQ-SSL-SSLMODE-STATEMENTS
83
84
Тип ЭЦП *-sha256* здесь не очень важен, потому что используется только для подписи запроса, а не самого сертификата.
85
86
h5. Подписываем сертификаты:
87
88
89
*openssl x509 -req -days 3650 -in myserver1.example.com.csr -CA server-ca.crt -CAkey server-ca.key -CAserial server-ca.srl -CAcreateserial -out myserver1.example.com.crt -extfile openssl.cnf -extensions server -sha256*
90
91
*openssl x509 -req -days 3650 -in myserver2.example.com.csr -CA server-ca.crt -CAkey server-ca.key -CAserial server-ca.srl -out myserver1.example.com.crt -extfile openssl.cnf -extensions server -sha256*
92
93
Тип ЭЦП *-sha256* здесь важен с точки зрения надежности. В 2016 году некоторые распространенные ранее типы ЭЦП типа sha1 не считается надежными.
94
95
Параметр *-CAcreateserial* Используется только первый раз.
96
97
h4. 1.2.1 CA сертификат для подписания клиентских сертификатов
98
99
Тут все по аналогии с пунктом 1.1.1.
100
101
Приведу только команды
102
103
*openssl genrsa -out client-ca.key -camellia256 2048*
104
*chmod 400 client-ca.key*
105
*openssl req -new -x509 -days 3650 -key client-ca.key -out client-ca.crt -subj '/C=RU/O=EKB-Info/CN=client-CA' -extensions v3_ca -sha256*