Действительно безопасные соединения или персональный CA

SSL — Secure Sockets Layer — протокол, позволяющий создавать безопасное соединение поверх обычного TCP соединения. Протокол позволяет решить две проблемы — предотвращение прослушивания потока, и проверку сторон соединения, что они являются теми, за кого себя выдают.

Рассмотрим на простом примере — веб-сервер в локальной сети, предоставляющий доступ до статистики. Как это решается обычно? Создаётся самоподписанный сертификат, выданный на имя сервера, подписанный самим сервером. Каждый раз при заходе на сайт, пользователь нажимает «Да, я согласен», даже не задумываясь, попадает на страницу статистики. Вводит логин, пароль, и радуется жизни.

Вот только где он ввел пароль?..


А что нужно для того, чтобы соединение было действительно безопасным? Для этого необходимо и достаточно, чтобы сертификат сервера был подписан не «абы кем», а центром сертификации, который есть у пользователя, и доверяем им. Тогда браузер проверит подпись, увидит, что сертификат выдан на правильное имя сервера, подписан центром сертификации, которому доверяет — и пропустит молча, не выдавая никаких сообщений о проблемах безопасност. Продвинутые браузеры, еще и будут вместо красного «Небезопасное соединение» показывать красивое зелёное «Всё безопасно».

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

Что же делать, если нужно обеспечить безопасность в локальной сети, например, или для маленького, но гордого, «почти free хостинга»? Выход прост: создать свой собственный центр авторизации (CA).

Применение своего CA позволяет решать сразу несколько моментов: с помощью своего CA легко подписывать сертификаты не только для web сервера, но и ftp, pop3, imap, smtp, xmpp и для любых других сервисов, умеющих использовать SSL. Так же, при необходимости, используя свой CA можно создавать авторизацию с помощью пользовательских сертифкатов, впрочем, об этом — в отдельной статье.

Создание своего CA



  1. Устанавливаем на сервере openssl (и sharutils для uuencode).
  2. Редактируем конфигурацию, использующуюся по умолчанию в файле /etc/ssl/openssl.cnf
  3. Придумаем название для нашего CA. Например, банальное MyCA. В дальнейшем, разумеется, заменяете значения по своему вкусу.
    В разделе [ ca ] исправляем CA_default на придуманное нами:
    default_ca = MyCA
    И исправляем название следующего раздела [ CA_default ] на придуманное нами. правим внутри значения, которые нас интересуют:
    [ MyCA ]
    dir = /var/spool/MyCA
    unique_subject = no # Это необходимо для перевыдачи сертификатов по истечении старых
    default_days = 365 # Для выдачи сертификатов для простых случаев, можно поставить 3650 и забыть про ежегодную перевыдачу сертификатов
    default_md = sha1 # Убедитесь, что стоит не хуже sha1 :)


    Для выдачи сертификатов своим сервисам без необходимости каждый раз отвечать на постоянные вопросы, найдите раздел [ req_distinguished_name ] и заполните в нем необходимые параметры:
    [ req_distinguished_name ]
    countryName_default = RU
    stateOrProvinceName_default = Moscow
    localityName_default = Moscow
    0.organizationName_default = My LAN
    organizationalUnitName_default = LAN Secure Services
    emailAddress_default = support@mylan

    Теперь, для того, чтобы выданные сертификаты действовали не только на имя сервера, но так же на его IP, на *.домен, добавим ниже в разделе:
    [ usr_cert ]
    nsComment = "Certificate for My LAN services"
    subjectAltName=DNS:*.mylan,DNS:mylan,DNS:192.168.1.250 # IP и домен подставить свои


END
# a2ensite https_mylan
# service apache2 reload
Всё! После этого можно зайти на mylan и радоваться зелёному значку безопасного соединения.
Главное, не забывайте устанавливать корневой сертификат на компьютер и во все браузеры.

Ссылки на полезные статьи

Теги:
ssl, безопасность, безопасность сайтов, шифрование

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.