Как вообще происходит проверка подлинности по ID-карте?
Аутентификация по ID-карте Эстонии настраивается на веб-сервере так, чтобы быть невидимой для клиентских приложений. В основном это происходит следующим образом:
1) Веб-сервер запрашивает сертификат у посетителя (т. е. у его браузера).
(Как браузер посетителя запрашивает его у посетителя, зависит от конкретного браузера)
2) После получения сертификата от браузера клиента веб-сервер проверяет следующее:
- сертификат ДОЛЖЕН БЫТЬ подписан со стороны AS Sertifitseerimiskeskus
Только после успешного выполнения проверки содержимое защищенной директории будет отображено, а PHP-приложение запущено на веб-сервере.
Что такое списки отзыва и как они обновляются?
Списки отзыва – это файлы, содержащие все сертификаты эстонских ID-карт, действие которых было приостановлено в тот или иной момент времени.
По данным Центра сертификации, списки отзыва могут обновляться в течение до 12 часов, поэтому может возникнуть ситуация, когда сертификат уже приостановлен, но еще не отражается в списке отзыва. По этой причине для приложений, требующих повышенной безопасности, всегда рекомендуется дополнительно использовать запрос пароля от посетителя и т. д.
Новые списки отзыва загружаются на виртуальные серверы Zone каждый час.
Что нужно для использования ID-карты в веб-приложениях?
Добавленный IP-адрес должен быть связан с соответствующим хостом из панели управления сервером (корневой домен виртуального сервера или один из его поддоменов).
Затем необходимо добавить файл .htaccess
, содержащий 2 строки, в каталог, доступ к которому посетитель может получить только при наличии подлинного удостоверения личности. В .htaccess должны быть добавлены следующие строки:
SSLVerifyClient require SSLVerifyDepth 2
Например, чтобы добавить поддержку ID-карт в https://companyname.ee/myapplication/, вам нужно создать файл /secure/htdocs/myapplication/.htaccess
и включить в него приведенные выше строки.
Как получить информацию об ID-карте посетителя от PHP?
Предполагаем, что поддержка ID-карты работает в нужном каталоге. Теперь необходимо получить информацию об ID-карте посетителя в приложений. Эта информация передается с веб-сервера в PHP через переменные среды.
В PHP есть функция getenv() для чтения переменных среды.
Для идентификации клиента существует переменная SSL_CLIENT_S_DN. Оно содержит имя, фамилию и ID посетителя.
Вы можете легко увидеть все переменные с помощью phpinfo(). Переменные, связанные с сертификатом ID-карты, находятся в разделе Apache Environment с префиксом SSL_CLIENT_*.
Личные данные в сертификате закодированы в формате UCS-2/UTF-16. Это позволяет использовать в имени человека символы, не присутствующие в таблице ASCII, например такие как ‘š’ ja ‘ž’. В результате все специальные символы заменяются двумя символами \\ и кодом символа в системе HEX.
Данные, закодированные таким образом, можно преобразовать в широко используемую кодировку UTF-8 с помощью следующего скрипта:
<?php function certstr2utf8 ($str) { $str = preg_replace_callback("/\\\\x([0-9ABCDEF]{1,2})/", function ($s) { return chr(hexdec($s[1])); }, $str); $result=""; $encoding=mb_detect_encoding($str,"ASCII, UCS2, UTF8"); if ($encoding=="ASCII") { $result=mb_convert_encoding($str, "UTF-8", "ASCII"); } else { if (substr_count($str,chr(0))>0) { $result=mb_convert_encoding($str, "UTF-8", "UCS2"); } else { $result=$str; } } return $result; } header ("Content-Type: text/html; charset=UTF-8"); $s = getenv ('SSL_CLIENT_S_DN'); $l = preg_split ('|/|', $s, -1, PREG_SPLIT_NO_EMPTY); foreach ($l as $e) { list ($n, $v) = explode ('=', $e, 2); echo $n . '=' . certstr2utf8 ($v) . "<br />"; } ?>