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* |