Аутентификация с использованием сертификата X.509

Защищенный протокол TLS, используемый в https, предоставляет встроенную возможность проходить аутентификацию по клиентскому X.509-сертификату.

Общие сведения о сертификате X.509

X.509-сертификат (далее, просто сертификат) — это конгломерат из открытого ключа пользователя, пользовательской информации, имени сертификата, называемого Distinguished Name (DN) и цифровой подписи удостоверяющего центра, которая скрепляет все эти данные друг с другом. Появляется возможность связать открытый ключ и DN пользователя, что может служить искомым ингредиентом процесса аутентификации, если в качестве идентификатора пользователя используется Distinguished Name его сертификата.

У сертификата есть срок действия, который ограничивает срок соответствия, создаваемого удостоверяющим центром.

X.509-сертификат в формате PEM может быть просмотрен в Windows с помощью стандартных средств.

Для понимания процесса аутентификации по сертификату важно знать, что сертификат содержит различные стандартные поля:

  • Issuer — информация об издателе. Пример: "CN = CA001, DC = EXAMPLE, DC = COM".

  • Validity:

    • Not Before — дата и время, с которой сертификат будет считаться действительным;
    • Not After — дата и время, после которого сертификат будет считаться просроченным.
  • Subject — поле идентификации субъекта (владельца) сертификата. Записывается в виде Distinguished Name. Пример: "CN=Васильев Василий Васильевич, OU=Support, DC=EXAMPLE, DC=COM".

  • SAN (Subject Alternative Name) — дополнительные реквизиты владельца сертификата. Используется для определения дополнительных субъектов, охватываемых действием данного сертификата, либо дополнительных реквизитов субъекта.

    Поле может содержать:

    • RFC822Name — адрес электронной почты владельца сертификата;
    • OtherName — произвольный набор параметров вида <имя_параметра>=<значение параметра>.

    Поле SAN широко используется в web-сертификатах для определения дополнительных сайтов, на которые может быть установлен сертификат (например, DNS Name=example.com).

    Также в Active Directory (AD) в SAN определяются дополнительные свойства владельца сертификата (например, электронная почта или уникальный идентификатор из AD — Object GUID).

Принцип работы входа по сертификату X.509

Аутентификация по SSL сертификату — это стандартный механизм подтверждения личности пользователя, этот механизм встроен в большинство современных веб-серверов.

  1. Пользователь получает сертификат для аутентификации у администратора. Это может быть файл сертификата в формате .p12, может быть сертификат на физическом устройстве, например, USB-токен доступа или SMART-карта.
  2. Пользователь добавляет свой сертификат в браузер (или это происходит автоматически).
  3. Пользователь переходит по ссылке в приложение.
  4. Пользователю предлагается указать сертификат для входа в приложение.
  5. Пользователь выбирает сертификат и подтверждает вход.
  6. Сервер проверяет, можно ли доверять сертификату.

    Если сертификату можно доверять, сервер передает сертификат в приложение.

  7. Приложение получает сертификат:

    • встроенными средствами Tomcat (при настройке аутентификации в Tomcat);
    • из заголовка HTTP, указанного в параметре ru.naumen.core.authentication.x509-authenticator.certificate-header.
  8. Приложение получает из сертификата поле, указанное в параметре ru.naumen.core.authentication.x509-authenticator.certificate-attribute.

    Возможные значения:

    • часть Subject-сертификата;
    • одно из полей SAN: RFC822, UPN, ObjectGUID.
  9. Приложение осуществляет поиск пользователя, по которому оно сопоставит входящего пользователя с его сущностью в системе. По умолчанию поиск происходит среди всех логинов пользователей, заведенных в системе.
  10. Если указан атрибут в параметре ru.naumen.core.authentication.x509-authenticator.auth-attribute, то поиск осуществляется по значениям этого атрибута.

    Атрибут должен быть строкового типа.

  11. Если приложение нашло пользователя, осуществляется вход.

Настройка конфигурации

Перед настройкой параметров конфигурации определите:

  • какое поле пользовательского сертификата будет ключом для авторизации в системе (логин или атрибут, созданный в системе специально для входа по X.509, например, Object GUID);
  • где будет происходить терминация SSL (на промежуточном программном обеспечении или непосредственно в Apache Tomcat).

Параметры конфигурации настраиваются в конфигурационном файле dbaccess.properties, см. dbaccess.properties.

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

  1. Добавьте в список типов аутентификации в системе аутентификатор "X.509":

    ru.naumen.core.authentication.authenticators=X509,INTERNAL
  2. Настройте веб-сервер на аутентификацию по сертификату.

  3. Укажите значения параметров конфигурации:

    • ru.naumen.core.authentication.x509-authenticator.certificate-attribute=SANGUID

      Поле сертификата, из которого будет получено значение для поиска пользователя в системе и последующего входа под этим сотрудником.

      Возможные значения:

      • CN, OU и т.д. — поиск будет осуществляться в Subject;
      • SANRFC822;
      • SANUPN;
      • SANGUID.
    • ru.naumen.core.authentication.x509-authenticator.certificate-header=X-SSL-CERT

      Имя заголовка с сертификатом в формате PEM.

      Параметр используется в случае терминации SSL на стороннем веб-сервере, например, nginx, IIS и т.п.

  4. Укажите код атрибута класса "Сотрудник" (employee) типа "строка", с которым будет сравниваться значение поля из сертификата.

    Если значение не указано, сравнение идет с системным атрибутом login.

    ru.naumen.core.authentication.x509-authenticator.auth-attribute=*код атрибута*
  5. Перезапустите приложение для включения аутентификатора X.509.

Примеры конфигурации

В зависимости от сервера, на котором выполняется проверка сертификата, поиск пользователя в системе осуществляется несколькими способами:

  • Проверка сертификата настроена в Apache Tomcat, поиск происходит по CN из поля сертификата Subject:

    ru.naumen.core.authentication.authenticators=X509,INTERNAL
    ru.naumen.core.authentication.x509-authenticator.certificate-attribute=CN
  • Проверка сертификата настроена в Nginx, поиск происходит по CN из поля сертификата Subject:

    ru.naumen.core.authentication.authenticators=X509,INTERNAL
    ru.naumen.core.authentication.x509-authenticator.certificate-header=X-SSL-CERT
    ru.naumen.core.authentication.x509-authenticator.certificate-attribute=CN
  • Проверка сертификата настроена в IIS, поиск происходит по UPN (1.3.6.1.4.1.311.20.2.3) из поля сертификата Subject Alternative Names:

    ru.naumen.core.authentication.authenticators=X509,INTERNAL
    ru.naumen.core.authentication.x509-authenticator.certificate-header=X-ARR-ClientCert
    ru.naumen.core.authentication.x509-authenticator.certificate-attribute=SANUPN
  • Проверка сертификата настроена в IIS, поиск происходит по GUID (1.3.6.1.4.1.311.25.1) из поля сертификата Subject Alternative Names.

    Поиск в системе осуществляется по строковому атрибуту "employeeGUID":

    ru.naumen.core.authentication.authenticators=X509,INTERNAL
    ru.naumen.core.authentication.x509-authenticator.certificate-header=X-ARR-ClientCert
    ru.naumen.core.authentication.x509-authenticator.certificate-attribute=SANGUID
    ru.naumen.core.authentication.x509-authenticator.auth-attribute=employeeGUID

    Атрибут класса "Сотрудник" (employee) нужно создать в системе заранее.

Настройка проверки клиентского сертификата на веб-сервере

Tomcat

До конфигурирования проверки клиентского сертификата настройте терминацию SSL на Tomcat.

В нужном коннекторе конфигурационного файла conf/server.xml в зависимости от протокола коннектора добавьте одну из опций:

  • Проверка клиентского сертификата:

    SSLCACertificateFile="C:\naumen\nausd4\conf\ca.crt"
    SSLVerifyClient="optional"
  • Truststore для проверки клиентского сертификата:

    truststorefile="/opt/naumen/nausd4/ssl/tomcat.jks"
    truststorepass="password"
    clientAuth="want"

Опции SSLVerifyClient и clientAuth могут принимать несколько значений. Подробное описание приведено в официальной документации Apache Tomcat.

Nginx

До конфигурирования проверки клиентского сертификата настройте Nginx как обратный прокси до Tomcat. Настройте терминацию SSL на Nginx и выполните следующие действия:

  1. Скопируйте файл в формате PEM, содержащий сертификаты CA для проверки пользовательских сертификатов, на сервер Nginx, например, в /etc/nginx/ssl/ca-client.crt.

  2. Добавьте в нужный блок server конфигурации Nginx параметры:

    ssl_client_certificate /etc/nginx/ssl/ca-client.crt;
    ssl_verify_client optional;

    Опция ssl_verify_client может принимать несколько значений. Подробное описание настроек приведено в официальной документации Nginx.

  3. Добавьте в тот же блок server, в нужный блок location опцию для передачи сертификата в приложение в заголовке X-SSL-CERT:

    proxy_set_header X-SSL-CERT $ssl_client_escaped_cert;
  4. Перечитайте конфигурацию Nginx с помощью команды reload или restart.

IIS

До конфигурирования проверки клиентского сертификата настройте IIS как обратный прокси до Tomcat. Для настройки терминации SSL на IIS:

  1. В диспетчере служб IIS в нужном сайте откройте параметры SSL.

  2. В блоке "Сертификаты клиента" выберите "Принимать" или "Требовать" в зависимости от необходимой конфигурации.

В результате сертификат будет автоматически передан в приложение в заголовке X-ARR-ClientCert.

Безопасность аутентификации по X.509

Если терминация SSL настроена на стороннем ПО, то это ПО отвечает за аутентификацию по сертификату X.509. Приложение будет отвечать за авторизацию пользователя по одному из полей сертификата, переданного в одном из заголовков HTTP-запроса в формате PEM.

Если проверка сертификата настроена на веб-сервере, злоумышленник может сгенерировать свой сертификат, передать заголовок с этим сертификатом в формате PEM напрямую в Tomcat, и, таким образом, войти в систему под нужным логином. Приложение в этой схеме не проверяет валидность предоставленного сертификата.

Для защиты рекомендуется запретить доступ в Tomcat, минуя ПО для терминации SSL (например, запускать коннекторы Tomcat только на локальном интерфейсе с помощью опции коннектора "address").