GnuTLS

Оригинал: Caleb Callaway. GnuTLS

Оглавление

Введение

GnuTLS - это реализация Transport Layer Security, преемника SSL под лицензией LGPL. С помощью GnuTLS можно избежать лицензионных проблем, возникающих при использовании более распространённого пакета OpenSSL. По этой причине некоторые пакеты, такие как OpenLDAP, в недавних выпусках Ubuntu собираются с поддержкой GnuTLS, а не OpenSSL.

В этом руководстве рассматривается использование инструментов GnuTLS для создания сертификатов для проверки подлинности узла и шифрования данных, передаваемых между клиентом и сервером. Для чтения этого руководства нужно быть знакомым с концепциями SSL/TLS. В руководстве по серверу Ubuntu имеется неплохое объяснение: https://help.ubuntu.com/9.04/serverguide/C/certificates-and-security.html.

Подготовка

Утилиты для создания сертификатов и отладки защищённых подключений находятся в пакете gnutls-bin. Установите его с помощью следующей команды:

$ sudo apt-get install gnutls-bin

Дополнительную информацию об инструментах gnutls можно найти здесь: http://www.gnu.org/software/gnutls/manual/html_node/

Именование ключей и сертификатов

При управлении несколькими ключами и сертификатами без понятной схемы именования можно легко запутаться. Ниже приведена одна из возможных схем.

  1. Имена файлов с приватными ключами серверов и служб можно составлять из доменного имени и расширения .key. Например, приватный ключ для сервера LDAP, работающего по адресу ldap.example.com, может иметь имя ldap.example.com.key.

  2. Для сертификатов серверов и служб можно использовать расширение .cert. Например, сертификат для сервера LDAP, работающего по адресу ldap.example.com, может иметь имя ldap.example.com.cert.

  3. Удостоверяющие центры можно считать службами, поэтому ключ удостоверяющего центра может иметь имя ca.example.com.key, а сертификат может иметь имя ca.example.com.cert.

Эта схема именования предназначена только наглядности: свойства ключей и сертификатов не зависят от имён файлов, под которыми они сохранены.

Полные доменные имена

Полное доменное имя, по которому клиенты устанавливают подключения, должно совпадать с полным доменным именем сервера в атрибуте сертификата DNSname. Если полное доменное имя, указанное в сертификате, не совпадает с полным доменным именем сервера, к которому подключается клиент, то программное обеспечение клиента должно отказаться от подключения. Это означает, что перед настройкой TLS нужно назначить серверу доменное имя и обеспечить доступность сервера DNS по сети.

Создание приватного ключа

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

  1. Для создания приватного ключа воспользуемся утилитой certtool из пакета GnuTLS, как показано ниже. Выберем "говорящее" имя в качестве <имени-ключа> (см. раздел "Именование ключей и сертификатов"). Кроме указанных ниже опций при создании приватного ключа можно использовать и другие опции, описанные в документации certtool.

    $ certtool --generate-privkey --bits 4096 --outfile <имя-ключа>
    Generating a 4096 bit RSA private key...
    

    На создание ключа может потребоваться 15-30 минут, в зависимости от загрузки компьютера. Длительность зависит не от длины ключа и сложности вычислений, а от скорости появления случайных чисел необходимого качества. Если случайные числа недостаточно случайные, они продолжают считываться до тех пор, пока не наберётся необходимое количество достаточно случайных чисел. Ускорить появление случайных чисел можно путём использования компьютера во время создания ключа.

  2. Как только ключ создан, ограничим права доступа к файлу с ключом:

    $ chmod 600 <имя-ключа>
    $ chown <доверенный-пользователь> <имя-ключа>
    

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

Создание сертификата

Существует три способа получения ключей и сертификатов:

  1. Создать самозаверенный сертификат. Этот способ самый простой, но не очень безопасный и масштабируемый.

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

  3. Организовать свой удостоверяющий центр. Этот метод безопасен и легко масштабируется, но потребует больше подготовительных действий и более долгосрочного сопровождения.

Каждый из указанных способов описан в одном из следующих разделов.

Самозаверенный сертификат

Для создания самозаверенного сертификата создадим шаблон сертификата в соответствии с описанием в разделе "Шаблоны сертификатов". Дадим файлу с шаблоном подходящее имя. Теперь передадим подготовленные данные в certtool:

$ certtool --generate-self-signed --load-privkey <имя-ключа> --template <имя-шаблона> --outfile <имя-сертификата>

Замените <имя-ключа> на имя файла приватного ключа из раздела "Создание приватного ключа". <имя-шаблона> - это имя файла шаблона (см. раздел "Шаблоны сертификатов"). Придумайте "говорящее" имя для <имени-сертификата> (см. раздел "Именование ключей и сертификатов").

Использование удостоверяющего центра

  1. Создайте приватный ключ (см. раздел "Создание приватного ключа").

  2. Создайте запрос на заверение сертификата:

    $ certtool --generate-request --load-privkey <имя-ключа> --outfile <имя-запроса>
    

    Вместо <имя-ключа> подставьте имя файла с приватным ключом. Выберем "говорящее" имя для использования вместо <имени-запроса>. Рекомендуется выбрать полное доменное имя сервера с расширением .csr.

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

  4. Создайте шаблон сертификата службы в соответствии с разделом "Шаблоны сертификатов" и сохраните его под соответствующим именем.

  5. Создайте сертификат:

    $ certtool --generate-certificate --load-request <заверенный-запрос> \
    --load-ca-certificate <сертификат-уц> \
    --template <имя-шаблона> --outfile <имя-сертификата>
    

    Замените <имя-ключа> на имя файла с приватным ключом из раздела "Создание приватного ключа". <имя-шаблона> - имя файла шаблона сервера (см. раздел "Шаблоны сертификатов"). Использовать шаблон не обязательно, но очень удобно, особенно если нужно создать много сертификатов. Выберите "говорящее" имя для использования вместо <имени-сертификата> (см. раздел "Именование ключей и сертификатов").

  6. Для установки сертификата воспользуйтесь инструкцией в разделе "Установка сертификата".

Свой удостоверяющий центр

  1. Создайте приватный ключ (см. раздел "Создание приватного ключа") и самозаверенный сертификат (см. раздел "Самозаверенный сертификат") для удостоверяющего центра. Убедитесь, что сможете чётко отличить ключи и сертификаты удостоверяющего центра и сервера.

    Замечание: Примите меры для защиты приватного ключа удостоверяющего центра! Если его украдут, то скомпрометированными окажется не только сертификат удостоверяющего центра, но и все заверенные им сертификаты!

  2. Создайте приватный ключ для службы или сервера.

  3. Создайте запрос на заверение сертификата (см. раздел "Использование удостоверяющего центра").

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

    $ certtool --generate-certificate --load-request <запрос> \
    --load-ca-certificate <сертификат-уц> --load-ca-privkey <ключ-уц> \
    [--template <имя-шаблона>] --outfile <имя-сертификата>
    

    Замените <запрос> на имя файла с запросом на заверение сертификата. <имя-шаблона> замените на имя файла шаблона сервера (см. раздел "Шаблоны сертификатов"). Использовать шаблон не обязательно, но очень удобно, особенно, если нужно создать много сертификатов. Выберите "говорящее" имя файла для <имени-сертификата> (см. раздел "Именование ключей и сертификатов").

  5. Для установки сертификата воспользуйтесь инструкцией из раздела "Установка сертификатов" .

Проверка сертификата

Проверьте сертификата путём просмотра его содержимого:

$ certtool --certificate-info --infile <имя-сертификата>

Шаблоны сертификатов

Свойства сертификатов можно указать в файле шаблона. В последующих разделах приведены простые шаблоны сертификатов для служб и удостоверяющих центров с некоторыми пояснительными комментариями, по большей мере взятыми из документации certtool. Необязательные выражения по умолчанию закомментированы. Убедитесь, что заменили все заглушки подходящими значениями.

Полное описание опций шаблона приведено в документации certtool.

ПРИМЕЧАНИЕ: в шаблонах ниже указаны опции, обязательные в понимании авторов этого руководства. НЕ устанавливайте сертификаты, созданные с этими опциями без понимания их назначения и проверки их правильности.

Сертификаты служб

# Опции сертификата X.509
#
# Опции известного имени
# Организация субъекта
organization = "АО Пример"
# Отдел организации субъекта
#unit = "Спящий отдел"
# Административная единица страны владельца сертификата
state = "Пример"
# Двухбуквенный код страны субъекта
country = EX
# Общее имя владельца сертификата
cn = "Салли Сертификатовладелец"
# Идентификатор пользователя владельца сертификата
#uid = "scertowner"
# Серийный номер сертификата. Должен увеличиваться при каждом создании нового сертификата
serial = 007
# Срок устаревания сертификата в днях, начиная с сегодняшнего
expiration_days = 365
# Расширения X.509 v3
# Доменное имя или имена сервера
dns_name = "server.example.com"
#dns_name = "server_alias.example.com"
# (Необязательный) IP-адрес сервера
#ip_address = "192.168.1.1"
# Будет ли этот сертификат использоваться TLS-сервером
tls_www_server
# Будет ил этот сертификат использоваться для шифрования данных
# (требуется TLS для шифрования RSA). Отметим, что предпочтительно
# использовать разные ключи для шифрования и заверения
encryption_key

Сертификаты удостоверяющих центров

# Опции сертификата X.509
#
# Опции известного имени
# Организация субъекта
organization = "АО Пример"
# Отдел организации субъекта
#unit = "Спящий отдел"
# Административная единица страны владельца сертификата
state = "Пример"
# Двухбуквенный код страны субъекта
country = EX
# Общее имя владельца сертификата
cn = "УЦ Пример"
# Серийный номер сертификата. Должен увеличиваться при каждом создании нового сертификата
serial = 007
# Срок устаревания сертификата в днях, начиная с сегодняшнего
expiration_days = 365
# Будет ли этот сертификат сертификатом удостоверяющего центра или нет
ca
# Будет ли этот ключ использоваться для заверения других сертификатов
cert_signing_key
# Будет ли этот ключ использоваться для заверения списка отозванных сертификатов
crl_signing_key

Установка сертификатов

Теперь, когда ключи и сертификаты созданы, их нужно сделать доступными для программ и служб. По умолчанию сертификаты размещают в каталоге /etc/ssl/certs/.

  1. Переместите сертификаты и установите права доступа в 755:

    $ mv *.cert /etc/ssl/certs
    $ chmod 755 /etc/ssl/certs/<имя-сертификата>
    
  2. Задайте владельца root и группу ssl:

    $ chown root:ssl /etc/ssl/certs/<имя-сертификата>
    

    По умолчанию приватные ключи размещают в каталог /etc/ssl/private/. Эта практика может оказаться недостаточно гибкой, особенно при управлении доступом к нескольким ключам. Я рекомендую поместить приватные ключи в подходящий подкаталог каталога /etc/. Например, приватный ключ для LDAP можно поместить в /etc/ldap/, а приватный ключ для веб-сервера - в каталог /etc/apache2/.

  3. Поменяйте права доступа к приватному ключу так, чтобы доступ к нему имел только владелец:

    $ chmod 600 <имя-ключа>
    

    Если нужно дать доступ к ключу другому пользователю в той же группе, ослабим права доступа и разрешим членам группы читать файл:

    $ chmod 640 <имя-ключа>
    

    Рекомендуется назначить владельцем файла пользователя root и назначить ту группу, в которой состоит пользователь, от имени которого работает демон. Напимер, приватный ключ для Apache может принадлежать группе www-data, поскольку демон Apache выполняется как пользователь, состоящий в этой группе.

  4. Настройте службы для использования ключа и сертификата. Действия по настройке зависят от настраиваемой программы, обратитесь к её документации за дополнительной информацией.

Веб-сервер Apache

Для установки сертификатов GnuTLS в веб-сервер Apache выполните следующие действия.

  1. Убедитесь, что модуль OpenSSL отключен:

    $ sudo a2dismod ssl
    
  2. Установите в Apache модуль GnuTLS:

    $ sudo apt-get install libapache2-mod-gnutls
    
  3. Убедитесь, что модуль GnuTLS для Apache включен:

    $ sudo a2enmod gnutls
    
  4. Добавьте следующие строки в конфигурацию сервера или виртуального узла (взято из wiki Gentoo):

    GnuTLSEnable on
    GnuTLSPriorities NORMAL:!DHE-RSA:!DHE-DSS:!AES-256-CBC:%COMPAT
    GnuTLSCertificateFile /путь/к/сертификату
    GnuTLSKeyFile /путь/к/ключу
    
  5. Убедитесь в отсутствии ссылок на mod_ssl:

    $ grep -r "mod_ssl" /etc/apache2/sites-enabled/
    
  6. При необходимости поменяйте mod_ssl на mod_gnutls.

  7. Перезапустите Apache:

    $ sudo service apache restart
    

AppArmor

Ограничением доступа различных служб управляет AppArmor. Убедитесь, что AppArmor настроен так, чтобы позволить службам доступ к соответствующим файлам.

Настройка клиента

Чтобы клиент принимал самозаверенный сертификат сервера, нужно поместить его копию в каталог /etc/ssl/certs/. В случае сертификатов, заверенных удостоверяющим центром, вместо сертификата сервера нужна копия сертификата удостоверяющего центра.

Настройка веб-браузера

Веб-браузеры обычно используют собственное хранилище сертификатов. Если вы используете самозаверенный сертификат или собственный удостоверяющий центр, такой сертификат нужно импортировать в хранилище сертификатов веб-браузера. В Firefox хранилище сертификатов доступно во вкладке "Дополнительные" в диалоге "Настройки".

Ссылки

  1. Документация certtool
  2. http://www.outoforder.cc/projects/apache/mod_gnutls/docs/
  3. http://en.gentoo-wiki.com/wiki/Apache2/SSL_and_Name_Based_Virtual_Hosts