Как удалить устаревший сертификат VPN из хранилища доверия
Удаление профиля VPN оставляет сертификат в ОС, браузере или магазине приложений. Сопоставьте по отпечатку, удалите самую узкую копию, затем проверьте цепочку.
Клиент VPN удалён, профиль исчез из «Параметров», а туннель всё равно поднимается со старыми учётными данными. Или вы удаляете его, перезагружаетесь и на следующее утро снова его находите. Но это не сломанная кнопка удаления. Профиль — это конфигурация; сертификат — это ключевой материал плюс решение о доверии, записанное в хранилище, на которое профиль лишь указывает. Что именно у вас в руках, определяет, что должно означать «удалить».
Профиль — не сертификат
В настройке VPN «сертификатом» называют три разных объекта. Идентичность клиента — это конечный сертификат с закрытым ключом, и шлюз по нему решает, кто вы. Собственный конечный сертификат сервера и его промежуточный сертификат — это то, что ваш клиент проверяет при подключении. Якорь доверия, обычно корневой или собственный сертификат CA, — это то, что вообще делает цепочку проверяемой. RFC 5280 называет их якорем доверия, промежуточным и конечным объектом, и цепочка действительна только пока каждое звено подписывает звено ниже.
Удалите идентичность — одно устройство теряет доступ. Удалите якорь — и каждое приложение, проверяющее доверие по этому хранилищу, теряет возможность проверять что-либо, выпущенное под ним, включая соединения, не имеющие отношения к VPN. Эта асимметрия и есть весь риск: корень, установленный для одного шлюза, часто тот же корень, которым подписан внутренний портал, почтовый сервер или зеркало пакетов. Помните, что из двух у вас в руках.
Владение решает, останется ли удаление удалённым. На вашем ноутбуке только вы можете вернуть сертификат. На управляемом устройстве профиль конфигурации или полезная нагрузка MDM может переустановить его при следующей регистрации, поэтому он «возвращается» и поэтому более настойчивое удаление не помогает.
Выясните, в каком хранилище он ещё есть
Люди начинают с приложения «Параметры», а это единственное место, где сертификат не хранится. Настоящие места — хранилища доверия ОС, собственное хранилище браузера и частное хранилище приложения.
| Store | What deleting from it affects |
|---|---|
| Windows CurrentUser\My | your login session only |
| Windows LocalMachine Root | every user and service on the machine |
| macOS login or System keychain | one account, or all of them with sudo |
| Linux ca-certificates bundle | curl, git, Python, anything using the system bundle |
| Firefox cert9.db | Firefox only; it does not read the OS store |
Сопоставляйте по серийному номеру или отпечатку, никогда по отображаемому имени. Отображаемые имена задаёт тот, кто выпустил сертификат, и они переиспользуются: «Example VPN» может быть три сертификата с тремя разными ключами, один из которых всё ещё используется ежедневно.
certutil -user -store My
certutil -store Root
openssl x509 -in vpn-client.pem -noout -subject -issuer -serial -fingerprint -sha256
В macOS инструмент security даёт те же факты, а find-identity показывает, у каких сертификатов ещё есть привязанный закрытый ключ:
security find-certificate -a -c "Example VPN" -Z /Library/Keychains/System.keychain
security find-identity -v -p ssl-client
Удаляйте узкий объект, сохраняйте общий издатель
Экспортируйте перед удалением. Без резервной копии единственное восстановление — перевыпуск, что для частного CA означает возврат к тому, кто управляет PKI. Экспортированный PFX — это ещё и то, что вы передаёте, если удаление окажется неверным решением.
certutil -user -exportPFX -p backup My <serial> C:\temp\vpn-id.pfx
certutil -user -delstore My <serial>
Remove-Item Cert:\CurrentUser\My<thumbprint>
Флаг -user — тот, который люди случайно пропускают. Без него certutil работает с хранилищем машины, а это повышенная оболочка, другой набор сертификатов и радиус поражения, который теперь включает все остальные учётные записи на машине.
В macOS и Linux форма та же: определите, экспортируйте, затем удалите из самого узкого хранилища, которое объясняет симптом. Удалить файл в /usr/local/share/ca-certificates и снова запустить update-ca-certificates достаточно; --fresh помогает только когда символические ссылки в /etc/ssl/certs уже несогласованы. Системы семейства RHEL хранят якоря в /etc/pki/ca-trust/source/anchors, где trust anchor --remove делает ту же работу.
sudo security delete-certificate -Z <sha1> /Library/Keychains/System.keychain
sudo rm /usr/local/share/ca-certificates/example-vpn.crt
sudo update-ca-certificates
sudo trust anchor --remove /etc/pki/ca-trust/source/anchors/example-vpn.crt
Перед удалением сертификата CA проверьте, что ещё выстраивается к нему в цепочку. Перечисление субъектов в пакете — проверка в две строки, и она отвечает, выполняет ли этот якорь другую работу:
openssl crl2pkcs7 -nocrl -certfile /etc/ssl/certs/ca-certificates.crt \
| openssl pkcs7 -print_certs -noout | grep -i example
Удаление файла — не отзыв идентичности
Локальное удаление убирает одну копию. Закрытый ключ может по-прежнему лежать в p12, приложенном к старому тикету, в папке резервных копий или на втором ноутбуке, настроенном в то же время. Если это была идентичность клиента, шлюз продолжает принимать любую копию этого ключа, пока идентичность не будет отклонена на стороне сервера.
Для OpenVPN PKI это означает отзыв сертификата и проверку того, что CRL, на которую ссылается crl-verify актуальна; easyrsa revoke а затем easyrsa gen-crl — короткая версия. Для шлюза, привязанного к поставщику идентичности, отключите пользователя или удалите устройство там, потому что сертификат — лишь одно учётное данное в игре. Удаление локальной копии при активной учётной записи выглядит как уборка и ею не является.
У инцидентной работы другой порядок: сначала сохраните сертификат, его серийный номер и запись об отзыве, затем удаляйте и отзывайте. Эти записи ничего не стоят и не требуют оставлять рабочие учётные данные на месте.
Проверьте рукопожатием и вторым приложением
Проверяйте цепочку снаружи, а не по списку хранилища, которое вы только что правили. Хранилище показывает вашу правку; рукопожатие показывает результат.
openssl s_client -connect vpn.example.com:443 -servername vpn.example.com \
-CAfile /etc/ssl/certs/ca-certificates.crt -verify_return_error < /dev/null
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt vpn-gateway.pem
Код возврата 0 означает, что оставшиеся якоря всё ещё проверяют шлюз. Ошибка цепочки после удаления якоря — ожидаемый результат, и она подтверждает, что вы попали в используемый якорь, а не в дубликат в хранилище, которое клиент никогда не читает. Если соединение всё ещё работает, ищите вторую копию, встроенное в приложение хранилище или закреплённый сертификат — всё это обычно у клиентов, несущих собственный список доверия.
Затем проверьте что-нибудь несвязанное: внутренний сайт, почтовый клиент, зеркало пакетов. Это дёшево измеряет радиус поражения, пока окно изменений не закрылось.
- Роль определена как идентичность, промежуточный сертификат или якорь доверия
- Серийный номер и отпечаток записаны, копия экспортирована в утверждённое место
- Удаление выполнено в самой узкой области, объясняющей симптом
- Авторизация на стороне сервера отозвана, когда человек или устройство ушли
- Рукопожатие объяснено, одно несвязанное приложение проверено повторно
- Полезная нагрузка MDM или профиль управления обновлены, иначе сертификат вернётся
Если после перезагрузки сертификат вернулся, работа не закончена: что-то им владеет и переустанавливает его. Найдите этого владельца, прежде чем удалять снова, потому что третье удаление поведёт себя точно как первые два.