Разобрался я как прикрутить к Апачу SSL и авторизовывать юзеров по клиентским сертификатам. Весьма удобно, должен заметить. В общем и целом схема проста:
- Создать собственный доверенный сертификат (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/[email protected] -out ca.crt
Описание аргументов:
- req
- Запрос на создание нового сертификата.
- -new
- Создание запроса на сертификат (Certificate Signing Request — далее CSR).
- -newkey
- Автоматически будет создан новый закрытый RSA ключ длиной 1024 бита. Длину ключа можете настроить по своему усмотрению.
- -nodes
- Не шифровать закрытый ключ (См. примечание выше).
- -keyout
- Закрытый ключ сохранить в файл ca.key.
- -x509
- Вместо создания CSR (см. опцию -new) создать самоподписанный сертификат.
- -days
- Срок действия сертификата 500 дней. Размер периода действия можете настроить по своему усмотрению. Не рекомендуется вводить маленькие значения, так как этим сертификатом вы будете подписывать клиентские сертификаты.
- -subj
- Данные сертификата, пары параметр=значение, перечисляются через ’/’. Символы в значении параметра могут быть «подсечены» с помощью обратного слэша “\”, например «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/[email protected].
- -out ca.crt
- Сертификат сохранить в файл ca.crt.
rsa:1024
ca.key
500
/C=RU/ST=Msk/L=Msk/O=My\ Inc/OU=Sale/CN=bla/[email protected]
В результате выполнения команды появятся два файла 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/[email protected] -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.
- -in
- CSR находится в файле client01.csr
- -out
- Сохранить сертификат в файл client01.crt
- -batch
- Не спрашивать подтверждения подписи.
ca.config
client01.csr
client01.crt
В результате выполнения команды появится файл клиентского сертификата 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
- Файл клиентского сертификата.
- -inkey
- Файл закрытого ключа.
- -certfile
- Файл доверенного сертификата.
- -out
- Сохранить данные в файл client01.p12.
- -passout
- Установить пароль q1w2e3 на файл (пароль может быть любым, в том числе и пустым)
client01.crt
client01.key
ca.crt
client01.p12
pass:q1w2e3
На этом процесс создания клиентского сертификата завершен. Теперь вам необходимо передать клиенту файл client01.p12 и пароль к нему любым удобным безопасным способом, а также проинструктировать его о процедуре инсталяции сертификата в броузер.
Для реализации процесса авторизации по клиентским сертификатам необходимо сконфигурировать веб-сервер для решения следующих задач:
- Запрет доступа к защищаемой области по протоколу HTTP.
- Запрос и проверка клиентских сертификатов.
Найдите в конфигурационном файле веб-сервера httpd.conf секцию <VirtualHost>, соответсвующую вашему сайту и добавьте в неё следующие директивы
<Directory /path/to/secure/area/>
SSLRequire
</Directory>
Описание директив:
- /path/to/secure/area/
- Абсолютный путь до директории защищаемой области.
- SSLRequire
- Запрещает доступ клиенту, если при соединении не используется протокол HTTPS (HTTP через SSL).
Найдите в конфигурационном файле веб-сервера httpd.conf секцию , соответсвующую вашему сайту и добавьте в неё следующие директивы:
SSLCACertificateFile /path/to/ca.crt
<Directory /path/to/secure/area/>
SSLVerifyClient require
</Directory>
Описание директив:
- SSLCACertificateFile /path/to/ca.crt
- Абсолютный путь до доверенного сертификатаТакже в качестве значения директивы SSLCACertificateFile может быть указан файл, содержащий несколько доверенных сертификатов (формируется путем обычной конкатенации файлов сертификатов), тогда все они будут считаться доверенными сертификатами.
- SSLVerifyClient require
- При наличии этой директивы веб-сервер будет запрашивать сертификат у клиента в обязательном порядке. Если клиент не предоставляет сертификат, тогда сервер отклоняет запрос. Если клиент предоставляет сертификат, то веб-сервер проверяет его срок действия и поставщика сертификата (сертификат которым он подписан), если сертификат поставщика присутсвует в файле SSLCACertificateFile, то проверка считается успешной и клиенту предоставляется доступ до защищенной области.
Для того, чтобы изменения конфигурационного файла веб-сервера вступили в силу необходимо перезапустить веб-сервер
# apachectl restart
Это все. Проверено на Apache/2.2.6 под Fedora 7.
По материалам opennet.ru
ca.config кривой нехватает секций ниже вроде верный
[ ca ]
default_ca = CA_CLIENT
[ CA_CLIENT ]
dir = ./db
certs = $dir/certs
new_certs_dir = $dir/newcerts
database = $dir/index.txt
serial = $dir/serial
certificate = ./ca.crt
private_key = ./ca.key
default_days = 365
default_crl_days = 7
default_md = md5
policy = policy_anything
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[…] Как сгенерить сертификаты, я рассказывал в этой статейке. […]