Прежде всего, обратите внимание, что я новичок в настройке SSL. В прошлом мне всегда везло, что у меня был ИТ-отдел, который заблаговременно настраивал это для меня. Так что будьте готовы к тому, что мне может понадобиться уточнить некоторые из ваших ответов. знак равно
Что я пытаюсь сделать
Я создаю корпоративный корпоративный веб-сайт для сотрудников. Например, будет стартовая страница браузера, на которой отображается контент, настроенный для каждого сотрудника. Таким образом, мне нужно иметь возможность идентифицировать указанного сотрудника, не требуя имени пользователя/пароля или других подсказок (однако однократная настройка в порядке; я просто не хочу, чтобы им приходилось каждый раз запрашивать). Естественно, SSL кажется лучшим способом сделать это.
У меня будет настройка базы данных MySQL для связывания учетных записей «пользователей» с SSL_CLIENT_M_SERIAL и SSL_CLIENT_I_DN, которые, как я предполагаю, будут уникальными для каждого клиентского сертификата (?). Я получил эту идею из этой статьи: http://cweiske.de/tagebuch/ssl-client-certificates.htm
В первый раз, когда пользователь заходит на внутренний веб-сайт, у него не будет сертификата (я НЕ хочу генерировать его вручную для клиентов!), и в этом случае $_SERVER["SSL_CLIENT_VERIFY"] == "NONE". Если это произойдет, он перейдет на страницу настройки учетной записи пользователя, которая будет включать в себя шаг, на котором PHP генерирует клиентский сертификат SSL и отправляет его в браузер для установки пользователем. Красиво и просто. Затем пользователь устанавливает сертификат, создается ассоциация, и после перезапуска браузера (на всякий случай) пользователь возвращается на внутренний веб-сайт.
На этом этапе Apache должен запросить сертификат клиента, который затем отправляет браузер. Затем PHP-скрипт анализирует необходимые переменные $_SERVER, сравнивает их с базой данных MySQL, и все получают удовольствие. Опять же красиво и просто.
Что пока работает
У меня установлены сертификаты на стороне сервера. И да, они самоподписанные (по понятным причинам). В Apache установлен mod_ssl, и все работает нормально. Я создал PHP-скрипт, который просто выводит массив $_SERVER, и все значения ключей SSL_SERVER_* соответствуют созданному для него сертификату.
Проблема
Я не могу заставить клиентские сертификаты работать! В том же PHP-скрипте, что бы я ни делал, SSL_CLIENT_VERIFY == "NONE" и другие ключи SSL_CLIENT_* отсутствуют. Вот что происходит, если в ssl.conf для SSLVerifyClient задано необязательное значение. Согласно каждому учебнику, который я читал, все они говорят, что веб-сервер должен запрашивать у браузера сертификат клиента. Дело в том, что я не могу заставить его сделать это! Он просто переходит прямо к PHP-скрипту и предполагает, что у меня вообще нет клиентских сертификатов. Это происходит в Firefox, Chrome и IE.
Поэтому я попытался установить для SSLVerifyClient требуемое значение и перезапустил веб-сервер. С этой опцией я даже не могу установить SSL-соединение. Firefox просто сообщает, что соединение было сброшено (другие браузеры также отображают свои версии этой ошибки). Странно то, что журналы не показывают НИКАКОЙ активности при этих попытках подключения! т.е. access_log, error_log, ssl_access_log, ssl_error_log и ssl_request_log не показывают НИЧЕГО; как будто и попытки не было. Это расстраивает, потому что это означает, что у меня даже нет сообщения об ошибке, с которым можно работать. Просто веб-сервер пассивно-агрессивно говорит мне идти к черту.
Я попытался сгенерировать/установить свой собственный клиентский сертификат вручную, используя расширение PHP OpenSSL. Сертификат установился просто отлично, хотя я не могу найти никакой информации о том, как связать этот сертификат с серверным (при условии, что мне это даже нужно?). Кроме того, в любом случае это не имеет значения, потому что Apache по-прежнему даже не будет запрашивать сертификат клиента, если установлен необязательный параметр. И если установлено требование, оно просто взрывается без объяснения причин. В любом случае мне нужно, чтобы эта схема работала как необязательная.
Окружающая среда
ОС: CentOS 5.7 64-бит (VirtualBox)
Апач: 2.2.3
PHP: 5.3.10
Я предполагаю, что вам может понадобиться дополнительная информация, чтобы помочь мне, поэтому, пожалуйста, спросите! Я предоставлю тебе все, что тебе нужно.
Подводя итог, мне нужно знать, как заставить Apache запрашивать сертификат клиента SSL с учетом условий, изложенных выше. Кроме того, если необходимо выполнить какую-либо специальную подпись/и т. д., чтобы сделать сертификат клиента «совместимым» с сертификатом сервера (опять же, БЕЗ выполнения этого вручную через оболочку для каждого сертификата клиента!), мне нужно знать, что как Что ж.
Я на 100% застрял в этом на данный момент. Не могу найти ничего даже отдаленно полезного в Google. Любая помощь, которую вы можете оказать в этом, будет ОЧЕНЬ оценена!! Спасибо! знак равно