Экспорт сертификатов из P12 без закрытого ключа
Пакет PKCS12 хранит ключи и сертификаты вместе. Сначала прочитайте структуру, а затем выберите сертификаты с -nokeys вместо удаления защиты.
В заявке в поддержку спрашивается, какой сертификат находится внутри пакета VPN, и первый порыв — экспортировать всё и приложить. Файл P12 упаковывает сертификаты и материал закрытого ключа в один контейнер, поэтому экспортировать всё — это именно то, что отправлять не нужно. Команда, отвечающая на вопрос, — это задача выбора, а не преобразования. Четыре флага решают, какую половину контейнера вы получите, и два из них звучат безопаснее, чем есть на самом деле.
Начните с чтения контейнера, а не с его опустошения.
Что на самом деле содержит файл PKCS12
Контейнер PKCS12 содержит один или несколько сертификатов, возможно закрытый ключ и message authentication code по содержимому. Сертификаты могут включать конечный сертификат удостоверения вашего клиента и промежуточные сертификаты, связывающие его с CA. Ключ, если он присутствует, — это то, что делает файл секретом, а не документом.
Это различие — причина, по которой существует -nokeys и по которой именно этот флаг нужен задаче.
Прочитайте пакет, не выписывая ключ
Форма проверки печатает структуру и сведения об алгоритмах и ничего не записывает: openssl pkcs12 -in client.p12 -info -noout. Она запрашивает пароль импорта, что является правильным местом для этого значения, и сообщает, содержит ли файл вообще ключ. Используйте -passin env:PKCS12_PASS, когда пароль нельзя ввести, потому что пароль в команде оболочки — это пароль в списке процессов. Этот шаг ничего не экспортирует, и в этом весь смысл.
Читайте вывод ради трёх вещей: сколько сертификатов, есть ли ключ и какие алгоритмы его защищают.
Используйте -nokeys и не путайте его с -nocerts
-nokeys исключает закрытые ключи и оставляет сертификаты. -clcerts сужает это до клиентских сертификатов, -cacerts сужает до сертификатов CA, и эти два — фильтры, а не альтернативы. -nocerts читается как безопасное написание той же идеи и означает противоположное: без сертификатов, что оставляет только ключи. Смешать его в экспорт сертификатов — так закрытый ключ и оказывается на диске.
Двухстрочная форма, которая создаёт файл сертификатов и файл CA и ничего больше, выглядит так:
openssl pkcs12 -in client.p12 -nokeys -clcerts -out client-certificates.pem
openssl pkcs12 -in client.p12 -nokeys -cacerts -out ca-certificates.pemУстаревшим пакетам нужен -legacy в OpenSSL 3, чтобы прочитать своё старое шифрование, и этот флаг меняет то, что принимает синтаксический анализатор, а не то, что он выдаёт. Если разбор завершается ошибкой о неподдерживаемом алгоритме, добавление -legacy — правильный первый шаг, а пропуск проверки MAC — нет.
Проверяйте вывод, а не код возврата
Нулевой код возврата говорит, что команда выполнилась, а не что файл содержит ожидаемое. Посчитайте сертификаты в выводе и прочитайте subject и даты: openssl x509 -in client-certificates.pem -noout -subject -dates -fingerprint. Сравните отпечаток с тем, который ожидает команда поддержки, потому что пакет с двумя клиентскими сертификатами даёт файл с двумя блоками, а большинство инструментов читает только первый. Назначение, доверие и совпадение ключа — снова отдельные проверки.
Сертификат, который разбирается, — это сертификат, который разбирается. Это не сертификат, который принимает VPN.
Решите, нужны ли вам файлы вообще
Если принимающий клиент импортирует PKCS12 напрямую, отправить исходный пакет по одобренному каналу, держа пароль отдельно, проще и сохраняет защиту. Извлечение нужно для проверки, для клиента, которому нужен PEM, или для обращения в поддержку, где запросили конкретный артефакт. Каждое извлечение снимает один слой и должно иметь причину.
Открытые сертификаты не содержат закрытого ключа, но содержат имена и сведения об организации. Передавайте поля, которые запросила заявка, вместо файла, если только запрошен не сам файл.