пятница, 18 апреля 2014 г.

Аутентификация по клиентским SSL сертификатам в Apache

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



Для аутентификации по клиентским SSL сертификатам необходимо выполнить следующие шаги:

1. Создание собственного самоподписанного доверенного сертификата.

Собственный доверенный сертификат (Certificate Authority - далее CA) необходим для подписи клиентских сертификатов и для их проверки при вторизации клиента веб-сервером.

openssl req -new -newkey rsa:1024 -nodes -keyout ca.key -x509 -days 5000 -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 5000
          Срок действия сертификата 5000 дней. Размер периода действия
          можете настроить по своему усмотрению. Не рекомендуется вводить
          маленькие значения, так как этим сертификатом вы будете
          подписывать клиентские сертификаты.
   -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.

   Просмотреть данные закрытого ключа и сертификата вы можете с помощью
   команд:
        # openssl rsa -noout -text -in ca.key              (для ключа)
        # openssl x509 -noout -text -in ca.crt             (для сертификата)

2. Создание клиентских сертификатов

2.1 Подготовка конфигурации и файлов для подписи сертификатов.

   Создайте конфигурационный файл с именем 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 (см. $4)
        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


     Примечание: В файле db/serial записывается текущий серийный номер
     подписываемого сертификата в шестнадцатиричном формате. В файл
     db/index.txt сохраняются данные о подписываемых сертификатах.

2.2 Создание клиентского закрытого ключа и запроса на сертификат (CSR).

   Для создания подписанного клиентского сертификата предварительно
   необходимо создать запрос на сертификат, для его последующей подписи.
   Аргументы команды полностью аналогичны аргументам использовавшимся при
   создании самоподписанного доверенного сертификата (см. $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. Просмотреть данные закрытого ключа и запроса на
   сертификат (CSR) вы можете с помощью команд:

        # openssl rsa -noout -text -in client01.key             (для ключа)
        # openssl req -noout -text -in client01.csr             (для запроса)

2.3 Подпись запроса на сертификат (CSR) с помощью доверенного сертификата (CA).

   При подписи запроса используются параметры заданные в файле ca.config

        # 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. Просмотреть данные сертификата вы можете с помощью
   команды:

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

3. Подготовка данных для передачи клиенту.

   Для передачи полученных в результате предыдущих операций файлов
   клиенту, обычно используется файл в формате 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 и пароль к нему любым
   удобным безопасным способом, а также проинструктировать его о
   процедуре инсталяции сертификата в броузер.

3. Настройка веб сервера Apache

В настройках Apache включить использование конфигурации для SSL:
Include conf/extra/httpd-ssl.conf

Добавляем наш CA сертификат в конфиг /extra/httpd-ssl.conf:

#   Certificate Authority (CA):
#   Set the CA certificate verification path where to find CA
#   certificates for client authentication or alternatively one
#   huge file containing all of them (file must be PEM encoded)
#   Note: Inside SSLCACertificatePath you need hash symlinks
#         to point to the certificate files. Use the provided
#         Makefile to update the hash symlinks after changes.
#SSLCACertificatePath "C:/Apache/ssl/test"
SSLCACertificateFile "C:/Apache/ssl/ca.crt"

Добавляем описание защищенной секции:

SSLInsecureRenegotiation on

<Location /secret/>
    SSLVerifyClient require
    SSLVerifyDepth 5
    SSLOptions +FakeBasicAuth
    SSLRequireSSL
    AuthName "My secure area"
    AuthType Basic
    AuthBasicProvider file
    AuthUserFile "C:\Apache\conf\httpd.passwd"
    Require valid-user
</Location>


Содержимое файла httpd.passwd:
/C=RU/ST=Msk/L=Msk/O=Inc/OU=Web/CN=usr/emailAddress=usr@dm.ru:$apr1$fOMcwZ0i$NJJXguc2meyd8k7MFYP1h. 
получаем с помощью команды:
$ openssl x509 -noout -subject -in client01.crt
subject= /C=RU/ST=Msk/L=Msk/O=Inc/OU=Web/CN=usr/emailAddress=usr@dm.ru
Значение "$apr1$fOMcwZ0i$NJJXguc2meyd8k7MFYP1h." - это слово password зашифрованное с помощью MD5:
htpasswd.exe -n -b test password
test:$apr1$y.8BXZ5U$XK9XcdmLMF6VQQLIGYgSI1
Предлагаемые варианты с сайта Apache на подошли !
(Note that no password is obtained from the user. Every entry in the user file needs this password: ``xxj31ZMTZzkVA'', which is the DES-encrypted version of the word `password''.
Those who
live under MD5-based encryption (for instance under FreeBSD or BSD/OS, etc.) should use the following MD5 hash of the same word: ``$1$OXLyS...$Owx8s2/m9/gfkcRVXzgoE/''.)


PS: Для доступа к сайту, защищенному сертификатом, из командной строки необходимо воспользоваться утилитой CURL:
curl -3 -k --cert client01.crt --key client01.key --url "https://10.10.10.10/secret/a.txt" -v

* STATE: DO => DO_DONE handle 0x80056ff0; line 1236 (connection #0)
* STATE: DO_DONE => WAITPERFORM handle 0x80056ff0; line 1352 (connection #0)
* STATE: WAITPERFORM => PERFORM handle 0x80056ff0; line 1363 (connection #0)
* SSLv3, TLS handshake, Hello request (0):
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Request CERT (13):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS handshake, CERT verify (15):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 200 OK
< Date: Fri, 18 Apr 2014 10:29:26 GMT
< Server: Apache/2.2.22 (Win32) mod_ssl/2.2.22 OpenSSL/0.9.8t DAV/2
< Last-Modified: Wed, 16 Apr 2014 10:04:31 GMT
< ETag: "300000001dee7-5-4f7260af097e2"
< Accept-Ranges: bytes
< Content-Length: 5
< Content-Type: text/plain
<
* STATE: PERFORM => DONE handle 0x80056ff0; line 1533 (connection #0)
* Connection #0 to host 10.10.10.10 left intact

Если статья была вам полезна - кликните на баннер или кнопку Donate :)
Яндекс.Метрика

Популярные сообщения