- Создать собственный доверенный сертификат (Certificate Authority), для того чтобы с помощью него подписывать и проверять клиентские сертификаты.
- Создать клиентские сертификаты, подписанные доверенным сертификатом, для последующей передачи их клиентам.
- Сконфигурировать веб-сервер для запроса и проверки клиентских сертификатов.
Начнем с первого пункта:
Собственный доверенный сертификат (Certificate Authority — далее CA) необходим для подписи клиентских сертификатов и для их проверки при авторизации клиента веб-сервером. С помощью приведенной ниже команды создается закрытый ключ и самоподписанный сертификат.
openssl req -new -newkey rsa:1024 -nodes -keyout ca.key -x509 -days 500 -subj /C=RU/ST=Msk/L=Msk/O=My Inc/OU=Sale/CN=bla/emailAddress=usr@dom.ru -out ca.crt
Описание аргументов:
- req
- Запрос на создание нового сертификата.
- -new
- Создание запроса на сертификат (Certificate Signing Request — далее CSR).
- -newkey
rsa:1024
- Автоматически будет создан новый закрытый RSA ключ длиной 1024 бита. Длину ключа можете настроить по своему усмотрению.
- -nodes
- Не шифровать закрытый ключ (См. примечание выше).
- -keyout
ca.key
- Закрытый ключ сохранить в файл ca.key.
- -x509
- Вместо создания CSR (см. опцию -new) создать самоподписанный сертификат.
- -days
500
- Срок действия сертификата 500 дней. Размер периода действия можете настроить по своему усмотрению. Не рекомендуется вводить маленькие значения, так как этим сертификатом вы будете подписывать клиентские сертификаты.
- -subj
/C=RU/ST=Msk/L=Msk/O=My Inc/OU=Sale/CN=bla/emailAddress=usr@dom.ru
- Данные сертификата, пары параметр=значение, перечисляются через ’/’. Символы в значении параметра могут быть «подсечены» с помощью обратного слэша "", например «O=My Inc». Также можно взять значение аргумента в кавычки, например, -subj «/xx/xx/xx».
- Описание параметров:
- С — Двухсимвольный код страны (Country). Необязательный параметр.
- ST — Название региона/области/края/республики/… (State Name). Необязательный параметр.
- L — Название города/поселка/… (Locality Name). Необязательный параметр.
- O — Название организации (Organization Name). Необязательный параметр.
- OU — Название отдела (Organization Unit). Необязательный параметр.
- CN — Имя сертификата, при создании серверных сертификатов используется доменное имя сайта, для клиентских сертификатов может быть использовано что угодно (Common Name). Обязательный параметр. Максимальная длина 64 символа.
- emailAddress — почтовый адрес (E-mail address). Необязательный параметр. Максимальная длина 40 символов.
Необязательные параметры могут быть пропущены, например, /C=RU/CN=blabla/emailAddress=user@domain.ru.
- -out ca.crt
- Сертификат сохранить в файл ca.crt.
В результате выполнения команды появятся два файла ca.key и ca.crt.
Далее нам необходимо сгенерировать клиентские сертификаты, что тоже не сложно.
Создайте конфигурационный файл с именем ca.config следующего содержания.
| [ ca ] |
| default_ca = CA_CLIENT |
# При подписи сертификатов |
|
# использовать секцию CA_CLIENT |
| [ CA_CLIENT ] |
|
| dir = ./db |
# Каталог для служебных файлов |
| certs = $dir/certs |
# Каталог для сертификатов |
| new_certs_dir = $dir/newcerts |
# Каталог для новых сертификатов |
| database = $dir/index.txt |
# Файл с базой данных |
|
# подписанных сертификатов |
| serial = $dir/serial |
# Файл содержащий серийный номер |
|
# сертификата |
|
# (в шестнадцатиричном формате) |
| certificate = ./ca.crt |
# Файл сертификата CA |
| private_key = ./ca.key |
# Файл закрытого ключа CA |
| default_days = 365 |
# Срок действия подписываемого |
|
# сертификата |
| default_crl_days = 7 |
# Срок действия CRL |
| default_md = md5 |
# Алгоритм подписи |
| policy = policy_anything |
# Название секции с описанием |
|
# политики в отношении данных |
|
# сертификата |
| [ policy_anything ] |
|
| countryName = optional |
# Код страны — не обязателен |
| stateOrProvinceName = optional |
# …… |
| localityName = optional |
# …… |
| organizationName = optional |
# …… |
| organizationalUnitName = optional |
# …… |
| commonName = supplied |
# …… — обязателен |
| emailAddress = optional |
# …… |
Создайте структуру каталогов и файлов, соответсвующую описанной в конфигурационном файле
# mkdir db
# mkdir db/certs
# mkdir db/newcerts
# touch db/index.txt
# echo «01» > db/serial
Для создания подписанного клиентского сертификата предварительно необходимо создать запрос на сертификат, для его последующей подписи. Аргументы команды полностью аналогичны аргументам использовавшимся при создании самоподписанного доверенного сертификата (см. $1), но отсутсвует параметр -x509.
# openssl req -new -newkey rsa:1024 -nodes -keyout client01.key -subj /C=RU/ST=Msk/L=Msk/O=Inc/OU=Web/CN=usr/emailAddress=usr@dm.ru -out client01.csr
В результате выполнения команды появятся два файла client01.key и client01.csr.
При подписи запроса используются параметры заданные в файле ca.config (см. $2.1.)
# openssl ca -config ca.config -in client01.csr -out client01.crt -batch
Описание аргументов:
- ca
- Подпись запроса с помощью CA.
- -config
ca.config
- Использовать конфигурационный файл ca.config.
- -in
client01.csr
- CSR находится в файле client01.csr
- -out
client01.crt
- Сохранить сертификат в файл client01.crt
- -batch
- Не спрашивать подтверждения подписи.
В результате выполнения команды появится файл клиентского сертификата client01.crt.
Для передачи полученных в результате предыдущих операций файлов клиенту, обычно используется файл в формате PKCS#12. В этот файл упаковывается и защищается паролем вся информация необходимая клиенту для инсталяции сертификата в броузер.
# openssl pkcs12 -export -in client01.crt -inkey client01.key -certfile ca.crt -out client01.p12 -passout pass:q1w2e3
Описание аргументов:
- pkcs12
- Работа с файлами формата PKCS#12.
- -export
- Экспортирование данных в файл.
- -in
client01.crt
- Файл клиентского сертификата.
- -inkey
client01.key
- Файл закрытого ключа.
- -certfile
ca.crt
- Файл доверенного сертификата.
- -out
client01.p12
- Сохранить данные в файл client01.p12.
- -passout
pass:q1w2e3
- Установить пароль q1w2e3 на файл (пароль может быть любым, в том числе и пустым)
На этом процесс создания клиентского сертификата завершен. Теперь вам необходимо передать клиенту файл client01.p12 и пароль к нему любым удобным безопасным способом, а также проинструктировать его о процедуре инсталяции сертификата в броузер.
Для реализации процесса авторизации по клиентским сертификатам необходимо сконфигурировать веб-сервер для решения следующих задач:
- Запрет доступа к защищаемой области по протоколу HTTP.
- Запрос и проверка клиентских сертификатов.
Найдите в конфигурационном файле веб-сервера httpd.conf секцию , соответсвующую вашему сайту и добавьте в неё следующие директивы
SSLRequire
Описание директив:
- /path/to/secure/area/
- Абсолютный путь до директории защищаемой области.
- SSLRequire
- Запрещает доступ клиенту, если при соединении не используется протокол HTTPS (HTTP через SSL).
Найдите в конфигурационном файле веб-сервера httpd.conf секцию , соответсвующую вашему сайту и добавьте в неё следующие директивы:
SSLCACertificateFile /path/to/ca.crt
SSLVerifyClient require
Описание директив:
- SSLCACertificateFile /path/to/ca.crt
- Абсолютный путь до доверенного сертификатаТакже в качестве значения директивы SSLCACertificateFile может быть указан файл, содержащий несколько доверенных сертификатов (формируется путем обычной конкатенации файлов сертификатов), тогда все они будут считаться доверенными сертификатами.
- SSLVerifyClient require
- При наличии этой директивы веб-сервер будет запрашивать сертификат у клиента в обязательном порядке. Если клиент не предоставляет сертификат, тогда сервер отклоняет запрос. Если клиент предоставляет сертификат, то веб-сервер проверяет его срок действия и поставщика сертификата (сертификат которым он подписан), если сертификат поставщика присутсвует в файле SSLCACertificateFile, то проверка считается успешной и клиенту предоставляется доступ до защищенной области.
Для того, чтобы изменения конфигурационного файла веб-сервера вступили в силу необходимо перезапустить веб-сервер
# apachectl /restart
Это все. Проверено на Apache/2.2.6 под Fedora 7.
Записки старого сисадмина
//