Два сертификата OpenVPN, одно имя CCD: что пошло не так
Серийный номер уникален только внутри своего издателя, а OpenVPN выбирает файл CCD по имени. Зарезервируйте это действующее имя при регистрации и контролируйте продление.
Два клиентских сертификата с разными серийными номерами, разными ключами и даже разными полными субъектами всё равно могут попасть в один файл политики, потому что сервер не смотрит ни на что из этого. Он читает имя из сертификата и открывает соответствующий файл конфигурации клиента. Если оба сертификата несут одно и то же имя, второй наследует политику первого в момент подключения.
Конфликт создаётся при регистрации и обнаруживается только при подключении, обычно когда устройство получает адрес или набор маршрутов, принадлежащих другой машине. Чтобы предотвратить это, нужно договориться, какое поле сопоставляет сервер, и затем зарезервировать это значение до того, как что-либо будет подписано.
Ваши инструменты для сертификатов не предупредят вас, потому что уникальность внутри X.509 и уникальность имени политики OpenVPN — это разные требования, применяемые разными системами.
Сервер ищет имя, а не отпечаток
При обычном сопоставлении на основе сертификатов сервер берёт общее имя из предъявленного сертификата и ищет файл с этим именем в своём каталоге конфигурации клиентов. Этот файл может закрепить статический адрес, отправить маршруты или применить метки межсетевого экрана для каждого клиента. Поиск — это совпадение строки с именем файла, поэтому регистр, пробелы и пунктуация имеют значение.
Некоторые развёртывания намеренно меняют сопоставление, чтобы аутентифицированное имя пользователя заменило общее имя, и тогда именно имя пользователя должно быть уникальным. В любом случае значение, выбирающее политику, — это значение, которое вы резервируете. Решите, какое именно, прежде чем что-либо выпускать; угадывать после конфликта дороже, чем спросить.
Где два органа сходятся на одном имени
Организация, принимающая сертификаты от более чем одного выдающего органа, ведёт два независимых процесса регистрации, пишущих в одно пространство имён. Собственные правила уникальности каждого органа действуют внутри него, поэтому оба могут законно выдавать сертификаты на одно и то же общее имя, и ни один не заметит ничего неправильного.
Серийные номера не помогают. X.509 требует, чтобы серийный номер был уникальным в пределах области его издателя, а это свойство бухгалтерии данного органа, а не глобальная идентичность устройства. Проверка субъекта — тоже другой тест, чем проверка общего имени: два сертификата могут разделять CN, но различаться организационным подразделением и поэтому нести разные субъекты. Все эти свойства могут выполняться, пока сервер всё равно сопоставляет оба сертификата с одним именем файла.
Документация OpenSSL CA описывает параметр unique_subject, который управляет мнением её собственной базы данных, и честная отправная точка — прочитать свою конфигурацию выпуска, а не предполагать, что действует какое-то конкретное значение по умолчанию EasyRSA или OpenSSL.
Зарезервируйте действующее имя до подписи
Ведите реестр, который сопоставляет устройство с его утверждённой записью и далее с точным именем файла политики, чтобы имя выделялось однажды и оставалось выделенным. Резервирование должно быть атомарным, что на практике означает ограничение базы данных или блокировку вокруг шага «выдели, затем подпиши», а не таблицу, которую редактируют два человека.
Затем сделайте проверку частью выпуска: отказывайте в подписи, если запрошенное имя уже существует, и включайте в эту проверку каждый орган, которому доверяет сервер, потому что имя, зарезервированное другим органом, занято точно так же. Отклонённый запрос с ясной причиной дешевле заявки об устройстве, которое постоянно получает чужой статический адрес.
Продление намеренно использует имя повторно
Перевыпуск для существующего устройства должен давать новый серийный номер под тем же именем политики, и это законное повторное использование, а не конфликт. Заранее нужно решить вопрос перекрытия: могут ли старый и новый сертификаты быть действительными одновременно, и как старые учётные данные выводятся из эксплуатации.
Не прибегайте к duplicate-cn, чтобы это решить. Эта серверная опция управляет одновременными подключениями с одним и тем же именем; она не блокирует регистрацию, и её включение не делает один общий статический адрес безопасным для двух машин одновременно. Отзыв обычно идентифицирует сертификат по издателю и серийному номеру, поэтому вывод старых учётных данных из эксплуатации не обязан аннулировать их замену, пока сервер получает и применяет правильные данные отзыва.
Подтвердите сопоставление инструментами на машине
Прежде чем передать устройству новые учётные данные, прочитайте имя из сертификата так, как это сделает сервер, а затем сравните его с файлом политики, который вы ожидаете увидеть выбранным.
openssl x509 -in device42.crt -noout -subject -nameopt sep_multiline
ls -l /etc/openvpn/ccd/device42
grep -n "duplicate-cn" /etc/openvpn/server.conf
Первая команда печатает поля субъекта отдельно, что сразу делает видимыми лишнее организационное подразделение или удвоенный пробел. Вторая подтверждает, что файл политики существует именно с этим именем, а третья показывает, настроен ли сервер разрешать несколько сеансов на одном имени. Запустите все три на новом сертификате, пока он ещё не вышел из шага регистрации, когда ошибка ещё стоит подписи, а не инцидента. Сохраните вывод вместе с заявкой, чтобы следующий человек увидел, какое имя сервер получил на самом деле.
Завершите реальным подключением и сравните назначенный адрес и отправленные маршруты с файлом политики, а не с тем, что вы собирались написать. Если два устройства сообщают об одном и том же статическом адресе, в реестре есть конфликт, который никакая проверка сертификатов никогда не выявит.