Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #74, ФЕВРАЛЬ 2005 г.

101 прием работы с OpenSSL

Anton Karpov

Хакер, номер #074, стр. 074-100-4


# chmod 600 myca.key

Перед тем, как генерировать запросы и сертификаты, советую взглянуть на openssl.cnf (/etc/ssl/openssl.cnf), в котором прописаны поля сертификата, их обязательность и дефолтные значения. Можешь поменять их, чтобы было проще, или даже указать все значения прямо в запросе (ключ "-subj"). Выпустим сапоподписанный сертификат на сгенерированном ключе:

# openssl req -new -x509 -days 365 -key myca.key -out myca.crt

Тебе будет задано несколько вопросов касаемо полей сертификата, и в результате ты получишь самоподписанный сертификат ca.crt. Теперь сгенерируем еще один ключ, для Apache:

# openssl genrsa -out server.key 2048

Создадим запрос на сертификат (CSR, certificate sign request):

# openssl req -new -key server.key -out server.csr

Подпишем запрос на ключе CA и выдадим нашему серверу новый сертификат:

# openssl x509 -req -days 365 -CA myca.crt -CAkey myca.key -in server.csr -out server.crt

# openssl verify -CAfile myca.crt server.crt

В процессе работы openssl ищет сертификат CA, CRL и некоторые другие параметры согласно файлу конфигурации /etc/ssl/openssl.cnf. Поэтому неплохо бы его заполнить, это избавит нас в том числе и от ввода параментов "-CA", "-CAkey" и т.д. Так, если ты назвал свою CA MyCA и расположил иерархию каталогов в /etc/ssl, то внеси в конфиг:

# vi /etc/ssl/openssl.cnf

[ ca ]

default_ca = MyCA

[ MyCA ]

dir = /etc/ssl

certs = $dir/crt

crl_dir = $dir/crl

database = $dir/index.txt

new_certs_dir = $dir/crt_new

certificate = $dir/ca.crt

serial = $dir/serial

crl = $dir/myca.crl

private_key = $dir/myca.key

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

# openssl ca -revoke server.crt -crl_reason affiliationChanged

Сгенерируем актуальный список отзыва (CRL):

# openssl ca -gencrl -out myca.crl

В index.txt должна появиться запись о смене статуса сертификата server.crt. Просмотреть же CRL можно следующей командой:

# openssl crl -in ca.crl -text -noout

Сам сертификат и его ключ можно просмотреть схожим образом:

# openssl x509 -in server.crt -noout -text

# openssl rsa -noout -text -in server.crt

Как настраивать Apache с mod_ssl, написано уже неоднократно, и я повторяться не буду. Но почему-то все ограничиваются банальной поддержкой https, а ведь с сертификатами можно натворить немало забавного. Например, создай папку ssl-area, к которой будут иметь доступ только те, у кого есть выданные тобой сертификаты. Для этого пропиши в конфиг ssl-хоста апача:

<Location /ssl-area>

SSLRequireSSL

SSLVerifyClient require

SSLVerifyDepth 1

</Location>

Наконец, важное замечание. Теоретически, сертификат - это открытый ключ. И некоторые программы (тот же Apache) разделяют понятия "сертификат" и "закрытый ключ" (и правильно), требуя указать в конфиге и то, и другое. Но некоторый софт, например, vsftpd, хочет найти в сертификате как публичный, так и закрытый ключ. Поэтому, если ты хочешь упростить себе жизнь, или столкнулся с тем, что какая-либо софтина не работает, помни, что ты просто можешь добавить secret key в конец сертификата (командой cat), хотя это, конечно, идеологически неверно.

Назад на стр. 074-100-3  Содержание  Вперед на стр. 074-100-5