Все мы рано или поздно сталкиваемся с тем что нужно выдавать сертификаты для защищенных протоколов HTTPS, IMAPS, SMTPS, для создания VPN-подключений или для подписи почтовых сообщений. В этой статье я опишу настройку простейшего центра сертификации (одноуровневой иерархии PKI), сразу замечу – это не лучший вариант для продакта, но это базис с которого лучше все начать разибираться с PKI.

Настройку PKI будем рассматривать на базе Centos 6.3, главным действующим лицом станет фирма с громким названием ООО “Руки и ноги” или по английски OOO “Hands and Feets”, у этой фирмы есть свой веб сайт ca.handsandfeets.ru, через который она будет распространять CRL.

1. Чуть-чуть теории

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

Что такое сертификат? Сертификат – это набор полей в формате x.509, содержащий идентификатор субъекта (например, имя пользователя или компьютера), время действия, имя издателя, назначение, используемые алгоритмы хеширования и шифрования, правила проверки подлинности и открытый ключ, а также цифровую подпись, которая позволяет удостоверить подлинность и целостность сертификата.

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

Как проверяется сертификат? Предположим, мы подключаемся к веб-серверу по протоколу https и получаем его сертификат.

  • Проверяем его срок годности.
  • Проверяем находится ли ЦС которым был выпущен сертификат, списке доверительных ЦС на нашем ПК.
  • Проверяем подпись сертификата, те считаем заново хеш-сумму от всех значащих полей сертификата, расшифровываем цифровую подпись сертификата при помощи открытого ключа ЦС и сравниваем с нашей хеш-суммой, если совпадает – значит сертификат действительный.
  • Если в сертификате указана точка распространения списка отзыва сертификатов (CDP), то забираем от-туда список отзыва сертификатов (CRL), проверяем его цифровую подпись и отсутствие в этом списке нашего сертификата.
  • Проверяем дополнительные поля, например, может ли этот сертификат использоваться для шифрования веб-трафика.

Этот процесс нужно очень хорошо понимать.

Что такое центр сертификации? Центр сертификации (ЦС) – это некоторый набор софта, главная функция которого выдача, контроль и отзыв сертификатов. Каждый ЦС имеет свой сертификат и закрытый ключ. Закрытый ключ нужно хранить как зеницу ока, потому что он используется для подписи всех выдаваемых сертификатов и списков отзыва (CRL). Cертификату ЦС должны по априори доверять все компьютеры в сети.

Что такое PKI? PKI (Public Key Infrastructure, Инфраструктура Открытого Ключа) – это набор средств и правил необходимых для поддержания иерархии сертификатов. Проще говоря – это совокупность сертификатов, правил их выдачи и отзыва, правил хранения ключей, центров сертификации и тд.

Что такое одноуровневая PKI? Одноуровневая иерархия PKI – это наиболее простое решение для управления сертификатами, это один корневой центр сертификации, который подписывает все выдаваемые сертификаты организации. Недостаток одноуровневой системы заключается в недостаточной защищенности, возможности компрометации закрытого ключа корневого центра сертификации.

2. Настройка корневого ЦС

Переходим в директорию /etc/pki/CA, с этого момента она станет нашей рабочей директорией и все 100% действий мы будем делать в пределах нее.

[root@ca_srv ~]# cd /etc/pki/CA

Создаем необхоимые для работы файлы, в index.txt будут записываться все выдаваемые сертификаты, в файлах serial будет храниться последний серийный номер выданного сертификата, а в crlnumber номер последнего списка отзыва сертификатов. Кажется мелочь, а работать без них ничего не будет.

[root@ca_srv CA]# touch index.txt
[root@ca_srv CA]# echo 01 > serial
[root@ca_srv CA]# echo 01 > crlnumber

Создаем директорию request, в нее мы будем складывать запросы на подпись сертификата.

[root@ca_srv CA]# mkdir request

Копируем файл с настройками центра сертификации и переходим к его редактированию.

[root@ca_srv CA]# cp ../tls/openssl.cnf .

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

# В этом разделе описывается список вопросов которые задаст нам openssl при запросе 
# нового сертификата, что бы сформировать так называемое уникальное имя DN. Что бы
# каждый раз не отвечать на них вручную зададим значения по умолчанию. 
[ req_distinguished_name ]
countryName_default           = RU
stateOrProvinceName_default   = Russian Federation
localityName_default          = Moscow
0.organizationName_default    = OOO 'Hands And Feets'
 
# Здесь описываются параметры которые ЦС во время подписывания добавит в клиентский
# сертификат 
[ usr_cert ] 
# Добавляем точку распространения сертификатов ЦС
authorityInfoAccess = caIssuers;URI:http://ca.handsandfeets.ru/rootca.crt
# Добавляем точку распространения списков отзыва сертификатов
crlDistributionPoints = URI:http://ca.handsandfeets.ru/rootca.crl
 
# Дополнительные расширения для самоподписанных сертификатов, они будут добавлены 
# в корневой сертификат ЦС при создании.
[ v3_ca ]
# Добавляем параметр pathlen, значение 0 говорит о том что этот ЦС не будет
# поддерживать подчиненные ЦС
basicConstraints = CA:true,pathlen:0
# Используется только для подписи сертификатов и списка отзыва сертификатов (CRL)
keyUsage = critical, cRLSign, keyCertSign

Теперь создадим сертификат корневого ЦС сроком на 5 лет, он спросит у нас пароль что бы зашифровать закрытый ключ и предложит заполнить несколько полей, в принципе немного раньше мы задали для них значения по умолчанию, поэтому смело щелкаем Enter, за исключением Common Name (CN) туда мы вводим полное название нашего ЦС OOO Hands And Feets Certification Authority.

[root@ca_srv CA]# openssl req -config openssl.cnf -new -x509 -keyout private/cakey.pem -out cacert.pem -days 1825
 . . .
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
 . . .
Common Name (eg, your name or your server's hostname) []:OOO Hands And Feets Certification Authority
 . . .

Создадим список отзыва сертификатов (CRL), пока он будет пустым. Однако очень важно что бы он существовал и был доступным, если клиент не сможет получить CRL, то сертификат скорее всего будет признан недействительным. После запуска openssl запросит пароль от закрытого ключа ЦС необходимый для подписи CRL.

[root@ca_srv CA]# openssl ca -config openssl.cnf -gencrl -out crl.pem
Using configuration from openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:

Теперь нужно опубликовать в интернете сертификат ЦС и список отзыва. У фирмы ООО “Руки и ноги” есть сайт ca.handsandfeets.ru, для простоты эксперимента предположим, что у нас настроен VirtualHost на сервере Apache, который перенаправляет все запросы с ca.handsandfeets.ru в директорию /var/www/html/pki. Настройка Apache более подробна описана в статье “Настройка NameVirtualHost”. Создадим две символические ссылки.

[root@ca_srv CA]# ln -s /etc/pki/CA/cacert.pem /var/www/html/pki/rootca.crt
[root@ca_srv CA]# ln -s /etc/pki/CA/crl.pem /var/www/html/pki/rootca.crl

В итоге у нас получился полностью работоспособный корневой центр сертификации.

3. Работа с сертификатами

Что делать с центром сертификации дальше? Здесь мы рассмотрим две основополагающие функции, то для чего нужен ЦС – это выдача и отзыв сертификатов.

3.1 Выдача сертификатов

Предположим что нам нужно выдать сертификат для защищенного при помощи SSLv3 сайта sslpdm.handsandfeets.ru. Создадим запрос к центру сертификации, как и при создании корневого ЦС он задаст нам кучу вопросов, мы на все щелкаем Enter, а в Common Name вводим имя узла sslpdm.handsandfeets.ru

[root@ca_srv CA]# openssl req -config openssl.cnf -new -nodes -keyout private/sslpdm.handsandfeets.ru.key -out request/sslpdm.handsandfeets.ru.csr
 . . .
Common Name (eg, your name or your server's hostname) []:sslpdm.handsandfeets.ru
 . . .

Отправляем запрос на сертификат sslpdm.handsandfeets.ru.csr на подпись в ЦС и на выходе мы получим готовый подписанный сертификат. Для подписи потребуется ввести пароль закрытого ключа ЦС и дважды согласиться щелкнув y.

[root@ca_srv CA]# openssl ca -config openssl.cnf -out certs/sslpdm.handsandfeets.ru.crt -infiles request/sslpdm.handsandfeets.ru.csr
 . . .
Enter pass phrase for /etc/pki/CA/private/cakey.pem:
 . . .
Sign the certificate? [y/n]:y
 . . .
1 out of 1 certificate requests certified, commit? [y/n]y
 . . .

Сертификат для сервера sslpdm.handsandfeets.ru будет лежать в файле certs/sslpdm.handsandfeets.ru.crt, а закрытый ключ в файле private/sslpdm.handsandfeets.ru.key.

3.2 Отзыв сертификатов

Следующая задача отозвать скомпрометированный сертификат веб-сервера sslpdm.handsandfeets.ru. Первой командой мы помечаем сертификат в базе ЦС как отозванный, а второй обновляем список отзыва сертификатов CRL. Для выполнения обоих команд потребуется пароль от закрытого ключа ЦС.

[root@ca_srv CA]# openssl ca -config openssl.cnf -revoke certs/sslpdm.handsandfeets.ru.crt
Using configuration from openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:
Revoking Certificate 01.
Data Base Updated
[root@ca_srv CA]# openssl ca -config openssl.cnf -gencrl -out crl.pem
Using configuration from openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:

4. Чуть-чуть заключения

Помнится наверно лет пять назад я наткнулся на длинную статью о том как настроить почтовый сервер на базе postfix и courier-imap, в ней якобы обязательным условием для запуска сервисов была генерация соответствующих сертификатов. Тогда вся работа с openssl показалась мне кучей шаманских действий, и в итоге я эту статью отложил и сделал по другой. Честно говоря этот маневр всего лишь немного оттянул время, и в конце-концов мне пришлось сначала генерировать самоподписанные сертификаты, а потом через еще какое-то время строить полноценную PKI.

Не забывайте цифровые сертификаты – это очень нужная и важная штука ;)

5 Коммент. : “Простейший центр сертификации для Linux”

  1. Владимир пишет:

    Спасибо за статью!

  2. Diversant пишет:

    Премного благодарен!
    Как раз то, что нужно для начала.

  3. Алексей пишет:

    Благодарю за статью.

    Есть вопрос: а каким образом должен работает механизм распространения доверенного корневого сертификата?

    Вот Вы пишите:
    # Добавляем точку распространения сертификатов ЦС
    authorityInfoAccess = caIssuers;URI:http://ca.handsandfeets.ru/rootca.crt

    Т.е. что получается: почтовый сервер, с которым мой почтовый сервер в режиме клиента будет пытаться установить зашифрованное smtp-соединение, для проверки предоставленного моим сервером клиентского сертификата должен будет перейти по ссылке в authorityInfoAccess, самостоятельно скачать корневой сертификат, каким-то образом установить его себе в качестве доверенного, и с его помощью проверить подлинность сертификата клиента. Так? И это всё в автоматическом режиме? Без вмешательства администратора?

    Или как?

  4. Алексей, привет.

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

    Чаще всего проверку сертификата в SMTPS отключают, что бы иметь возможность принимать письма он неправильно настроенных почтовиков.

  5. agelo пишет:

    Здравствуйте
    Подскажите , а в UBUNTU , установил сервер , а каталогов /PKI – нет
    Их надо создавать вручную или я что-то не поставил ?

Оставить комментарий