Авторизация на веб-сервере Apache по сертификату

На днях для внутренних нужд компании потребовалось настроить веб-сервер Apache для авторизации пользователей в приложении с использованием цифровых сертификатов. Причем так, чтобы все было кошерно :) т.е. все сертификаты должны быть подписаны внутренним удостоверяющим центром Microsoft CA.

Стоит признаться, что пришлось несколько повозиться, ибо подробного howto на просторах нашей бескрайней мне найти не удалось. Потому предположил, что шпаргалка на эту тему может оказаться полезной.

Постановка задачи:

требуется настроить авторизацию на веб-сервере Apache с использованием подписанных цифровых сертификатов внутренним удостоверяющим центром Microsoft CA.

Решение:

1. Создаем пару ключей (server.key) и запрос сертификата для центра сертификации (request.der)

openssl req -new -inform DER -sha1 -newkey rsa:2048 -nodes -keyout server.key -out request.der -subj "/CN=site.name.ru"

2. В оснастке "Шаблоны сертификатов" на сервере Microsoft CA разрешаем требуемому пользователю (например, себе) осуществлять подачу заявки на шаблон сертификата "Проверка подлинности сервера". Далее, в оснастке центра сертификации, создаем выдаваемый шаблон этого сертификата.

3. Отправляемся по адресу http(s)://<MicrosoftCa>/certsrv/, где выбираем "Запроса сертификата", после чего "расширенный запрос сертификата" и "Выдать запрос, используя base-64 шифрованный файл PKCS #10...". В поле "Сохраненный запрос" передаем содержимое файла request.der, а в выпадающем списке выбираем имя шаблона сертификата, созданного на предыдущем этапе. После чего, сертификат в формате DER-шифрования (certnew.cer) можно переместить в каталог с файлом server.key.

4. Теперь необходимо выполнить:
openssl x509 -in certnew.cer -inform DER -out server.crt

Проверка контрольных сумм.
Открытый ключ: openssl x509 -noout -modulus -in server.crt | openssl sha1
Закрытый ключ: openssl rsa -noout -modulus -in server.key | openssl sha1

На этом этапе уже можно использовать стандартную конфигурацию веб-сервера Apache для работы с односторонним SSL.

5. Для того чтобы пользователи могли запрашивать сертификаты проверки подлинности, отвечающие определенным требованиям, может вновь потребоваться шаманство с оснасткой "Шаблоны сертификатов" на сервере Microsoft CA. Есть и другой путь – стать владельцем сертификата "Enrollment Agent" и уже самостоятельно раздавать сертификаты конечным пользователям.

6. Чтобы веб-сервер Apache запрашивал клиентские сертификаты, необходимо внести следующие директивы в его конфигурационный файл (предполагается, что остальные директивы дополнены используемой конфигурацией настроек SSL по умолчанию, поставляемой с веб-сервером Apache):

...
SSLCACertificateFile /etc/ssl/certs.list
<Directory "/secure/www/">
SSLVerifyClient require
SSLOptions +FakeBasicAuth
AuthName "Auth require"
AuthType Basic
AuthUserFile /etc/ssl/certs.users
require valid-user

...
</Directory>
...

, где файл "/etc/ssl/certs.list" содержит открытый ключ (или цепочку сертификатов) удостоверяющего центра Microsoft CA в формате base64 (его можно подгрузить из точки распространения);

файл "/etc/ssl/certs.users" содержит список пользователей, которым разрешен доступ к каталогу "/secure/www/".

Формат файла "/etc/ssl/certs.users":

/DC=local/DC=dc/OU=users/CN=username1/emailAddress=username1@dc.local:xxj31ZMTZzkVA
/DC=local/DC=dc/OU=users/CN=username2/emailAddress=username2@dc.local:xxj31ZMTZzkVA
...

Чтобы получить указанный формат, можно воспользоваться командой:
openssl x509 -noout -subject -in client.crt

Магическая строка "xxj31ZMTZzkVA" всегда неизменна (это результат шифрования строки "password" с помощью алгоритма DES).

Вот собственно и все.

5 комментариев :

  1. DES ведь соленый... или соль "xx" важна?

    ОтветитьУдалить
  2. Плохо искал)) Правда у меня не на Microsoft CA, но по аналогии.
    http://rootfox.com/blog/archives/242

    ОтветитьУдалить
  3. to Анонимный:

    в данном случае это вообще не важно.

    to netf0x:

    видел :) однако ты ничего не говоришь про ключевой файл SSLCACertificateFile, содержащий открытый ключ CA в этой схеме. в моем случае, в этом файле целая цепочка сертификатов к корневому CA.

    ОтветитьУдалить
  4. ага ещё можно было создать хранилише сертификатов в АД использовать смарт карты использовать в качестве электронной подписи или шифрования - един центр сертификации )))))

    пс: толсто думаю

    ОтветитьУдалить
  5. to Dmitry Evteev:
    У меня просто схема была попроще, а SSLCACertificateFile указан в куске приведенного конфига, да и сам я более раздолбай))

    ОтветитьУдалить