Страница 1 из 1

ssl, tls, сертификаты и так далее

Добавлено: 01 фев 2015, 20:29
RomA
Введение:
Рано или поздно все люди задумываются о безопасности. Кто-то покупаем новый замок, что бы обезопасить свой дом, кто-то газовый баллончик для себя... Мы же будем защищать свои данные.

Задача:
Давайте составим техзадание.
Задача: обезопасить наши соединения со своим сервером.
Соединения: сайт, почта
Сайт: 80 порт - сделать ничего не можем, кроме как переадресовывать на https - то есть поднимаем https - 443 порт
Почта: 25 порт - никуда не деться - могут быть сервера с несознательными админами - если просто запретить все нешифрованные соединения можно что-то пропустить. Но поднимать шифрование надо - значит 465 порты. так же надо ещё и отдавать почту клинету. Я буду использовать imap-протокол и его секьюрную версию - значит 993 порт.

Решение:
Ну а начнём мы не с этого всего, а с получения сертификата. Нет, ну можно и самоподписанный сделать, но зачем, если бесплатно раздают валидные?
Итак, идём на сайт https://www.startssl.com и регистрируемся. Вам на почту прийдёт (мгновенно) код проверки - вставляете его на сайт и заканчивайте регистрацию. Тут же с сайта вам свалится сертификат, который надо установить в систему - это будет ваш логин-пароль на этот сайт в дальнейшем.
Заходим уже под собой на сайт и генерируем себе сертификат - он выдаётся на доменное имя - в моём случае это будет mail.cz6.ru - таким образом я сразу себе понимаю, что вебморда, приём и отправка почты у меня будет происходить по адресу mail.cz6.ru - если у вас будут разные доменные имена, типа smtp.cz6.ru - вам прийдётся делать на сайте несколько сертификатов. Ну да ладно - это не сложно:
1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
7.jpg
8.jpg
В результате этих действий у нас на сервере появилось 2 файла - если следовать рекомендациям - это ssl.key и ssl.crt - скачаем к ним третий

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

root@mail:/usr/local/etc/nginx/ssl/mail # fetch http://www.startssl.com/certs/sub.class1.server.ca.pem
sub.class1.server.ca.pem                      100% of 2212  B 3349 kBps 00m00s
root@mail:/usr/local/etc/nginx/ssl/mail #
Но и этого нам мало - дело в том, что мы создали сертификат с паролем и, что бы запустить программу, надо будет каждый раз этот пароль вводить. Ну или писать его в конфиг. Но от него можно избавиться - создадим ключ без пароля

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

root@mail:/usr/local/etc/nginx/ssl/mail # openssl rsa -in ./ssl.key -out ./ssl-nopass.pem
Enter pass phrase for ./ssl.key:
writing RSA key
root@mail:/usr/local/etc/nginx/ssl/mail # 
Теперь всё - из этих файлов мы будем готовить для каждой программы свой рецепт.

postfix и шифрование

Добавлено: 07 фев 2015, 18:09
RomA
Введение:
Предполагается что у вас уже установлен, настроен и работает postfix. Если это не так - вот тут есть описание как это исправить :-)

Задача:
Хочется принимать и отправлять почту по защищённому каналу, а значит прийдется прикрутить наши сертификатики.

Условие:
для работы почты выбран домен mail.cz6.ru - значит именно на это имя и надо получить сертификат, если пользуетесь статьёй выше - он прикроеn как mail.cz6.ru так и просто cz6.ru

Реализация:
Для начало надо приготовить сертификат для постфикса - по статье выше получаем сертификат на домен и скачиваем удостоверяющий сертификат - таким образом у нас в папке оказываются 2 файла - сертификат домена, удостоверяющий и ключ.

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

# ls 
ssl.crt
ssl.key
sub.class1.server.ca.pem
# 
Теперь надо снять пароль с файла ключа - это тоже описано выше - у нас повится ещё один файлик serv-nokey.pem
Создадим файл для постфикса:

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

cat ./ssl.key ./ssl.crt ./sub.class1.server.ca.pem > postfix.pem
Теперь надо в постфиксе прописать к этому файлу путь.
Вообще для включения шифрования мы будем править 2 файла - я приводу листинг обоих - тут всё, что касается ssl или tls настроек
файл main.cf

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

smtpd_sasl_auth_enable = yes                                                                                      
smtp_sasl_security_options = noanonymous                                                                          
broken_sasl_auth_clients = yes                                                                                    
smtpd_sasl_type = dovecot
smtpd_sasl_path = /var/spool/postfix/dovecot-auth
smtp_sasl_password_maps = mysql:/etc/postfix/sql/sasl.cf
smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /etc/postfix/postfix.pem
smtpd_tls_cert_file = /etc/postfix/postfix.pem
smtpd_tls_CAfile = /etc/postfix/postfix.pem
smtpd_tls_loglevel = 9
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
В принципе с этим уже заработает, но мы ещё поправим файл master.cf что бы postfix ещё слушал и 465 порт (мой провайдер успешно закрывает 25 порт всем клиентам - так что приходится юзать другие порты)

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

smtps     inet  n       -       n       -       -       smtpd
   -o smtpd_tls_wrappermode=yes
   -o smtpd_sasl_auth_enable=yes
   -o smtpd_client_restrictions=permit_sasl_authenticated,reject
Теперь всё. Перезапускаем и всё работает.

Траблешутинг:
1) То, что порт слушается можно проверить по старинке

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

telnet localhost 25
или

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

telnet localhost 465
- в первом случае команда ehlo mail выполнится, во втором нет
2) Что бы проверить шифрование надо выполнить такую команду

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

openssl s_client -starttls smtp -showcerts -connect localhost:25
ну или

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

openssl s_client -starttls smtp -showcerts -connect localhost:465
- в первом случе увидите сертификат, во втром будет просто написано что соединено

Ну а что бы проверить и сам сервер за сертификатом, делаем так:

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

openssl s_client -connect localhost:465
Тут нам выведется информация о сертификате, а потом будет командная строка почтового сервера

Литература:
Всё сделано так, как описано в этой статье http://habrahabr.ru/post/106314/?reply_to=3344322

2016 год - получение сертификата

Добавлено: 19 янв 2016, 11:28
RomA
Введение
Время идет и интерфейсы меняются. В связи с этим обновлю и скриншоты получения сертификата.

Подготовительные мероприятия:
Для начала нам надо сгенерировать файл ключа для сертификата.

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

root@mail:/ # openssl genrsa -des3 -out ./private.key 2048
Тут у вас спросят 2 раза пароль на сертификат - надо бы его придумать.

По хорошему этот фал надо будет потом отдать вебсерверу, для открытия сертификата, но файл под паролем - прийдется при запуске сервиса вводить пароль. Потому сразу же сделаем файл без пароля, который и отдадим веб-серверу:

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

root@mail:/ # openssl rsa -in private.key -out ssl-nopass.key
Тут у вас спросят пароль на открытие файла, после чего будет создан файл ключа без пароля. Как защищать этот файл - решать вам.

Теперь надо создать фал запроса сертификата для своего доменного имени:

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

root@mail:/ # openssl req -new -key private.key -out forumcz6ru.csr
Вам будут заданы вопросы - вот как отвечал я:

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

Enter pass phrase for private.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Belgorod region
Locality Name (eg, city) []:Stary Oskol
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CZ6RU
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:forum.cz6.ru
Email Address []:roman@cz6.ru

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:Roman Perepechaev
Пройдемся по английским буковкам:
Common Name - Полное имя домена, на который выписывается сертификат (для Wildcard-сертификата имя домена должно начинаться с «*.»)
Country Name - Двухбуквенный код страны
State or Province Name - Наименование области или края, в которой зарегистрирована организация
Locality Name - Название населенного пункта: город, поселок, село…
Organization Name - Полное название организации по Уставу, или ФИО физического лица
Organizational Unit Name - Наименование отдела, который приобретает сертификат (не обязательное поле ввода)
e-mail adress - электронный адрес для дальнейшего подтверждения данных (не обязательное поле ввода)

После того, как вы ответите на все вопросы - у вас создастся файлик запроса сертификата - его содержимое надо будет загрузить в специальное окошко на сайте... ну а прочитать содержимое можно так:

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

root@mail:/ # cat forumcz6ru.csr
Получение сертификата на сайте
Теперь надо получить сам сертификат - для этого воспользуемся сайтом из предыдущей статьи и заполним страничку получения сертификата
ssl1.jpg
ssl2.jpg
ssl3.jpg
Установка сертификата
Как и в предыдущей статье я буду настраивать nginx - потому приведу только те 2 строчки, что я правил, относительно предыдущей конфигурации

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

ssl_certificate     /1_forum.cz6.ru_bundle.crt;
ssl_certificate_key /ssl-nopass.key;
1_forum.cz6.ru_bundle.crt - это файлик, который скачался в архиве с сайта - там есть специальный для Nginx
ssl-nopass.key - а этот файлик мы делали в самом начале этой статьи

теперь осталось перезапустить вебсервер и наслаждаться результатом.
До
ssl4.jpg
После
ssl5.jpg
Литература:
http://www.securitylab.ru/analytics/456595.php
http://xgu.ru/wiki/OpenSSL#.D0.9A.D0.B0 ... 2.D0.B0.3F
http://ashep.org/2011/nginx-staticheski ... ver-s-ssl/
https://www.digicert.com/ssl-certificat ... -nginx.htm
https://бэкдор.рф/настройка-ssl-в-nginx-1-9/
http://ssl.best-hosting.ru/info/how-cre ... quest.html

Команды для работы с сертификатами

Добавлено: 19 янв 2016, 17:00
RomA
Посмотреть до какой даты действителен сертификат:

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

openssl x509 -noout -in ФАЙЛ_СЕРТИФИКАТА  -dates

Переиздание сертификата.

Добавлено: 16 янв 2017, 18:56
RomA
Год 2017. Опять пришло время обновлять сертификат. Буду краток.
Генерируем запрос:

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

openssl req -newkey rsa:4096 -keyout forum.cz6.ru.key -out forum.cz6.ru.csr
В начале спросит пароль - придумаем и введём. В конце просто унтер 2 раза - там не нужно ничего придумывать. Полностью это выглядит так:

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

roman@mail:/usr/home/roman/ssl# openssl req -newkey rsa:4096 -keyout forum.cz6.ru.key -out forum.cz6.ru.csr
Generating a 4096 bit RSA private key
.................................................................................................................................................++
................................................................................++
writing new private key to 'forum.cz6.ru.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Moscow
Locality Name (eg, city) []:Moscow
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CZ6RU
Organizational Unit Name (eg, section) []:Roman Perepechaev
Common Name (e.g. server FQDN or YOUR name) []:forum.cz6.ru
Email Address []:roman@cz6.ru

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
roman@mail:/usr/home/roman/ssl#
Сразу снимем пароль для ключа:

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

openssl rsa -in ./forum.cz6.ru.key -out ./forum-nopass.key
Полностью это выглядит так:

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

roman@mail:/usr/home/roman/ssl# openssl rsa -in ./forum.cz6.ru.key -out ./forum-nopass.key
Enter pass phrase for ./forum.cz6.ru.key:
writing RSA key
roman@mail:/usr/home/roman/ssl# 
Теперь нужно скормить сайту файл forum.cz6.ru.csr и получить в ответ новый сертификат

Посмотреть срок действия сертификатаов

Добавлено: 14 апр 2018, 18:53
RomA
Для того что бы посмотреть с какого и по какое действует сертификат надо выполнить следующую команду, подставив вместе:
localhost - имя сервера
993 - порт нужного сервиса (443,465, 993)
echo | openssl s_client -connect localhost:993 | openssl x509 -noout -dates