Форматы ключей и сертификатов: PEM, DER, PKCS#8, SPKI¶
Формат файла не равен алгоритму. Один и тот же открытый ключ ГОСТ может быть представлен текстовым PEM или бинарным DER; закрытый ключ обычно кодируется структурой PKCS#8 PrivateKeyInfo, открытый — SubjectPublicKeyInfo (SPKI).
Как отличить файлы¶
file private.pem public.pem certificate.crt
head -n 2 public.pem
openssl pkey -in private.pem -noout -check
openssl x509 -in certificate.crt -noout -subject
Типовые заголовки: BEGIN PRIVATE KEY, BEGIN PUBLIC KEY, BEGIN CERTIFICATE, BEGIN CERTIFICATE REQUEST. Нельзя определять содержимое только по расширению .pem.
Получить SPKI из закрытого ключа¶
openssl pkey -in private.pem -pubout -out public.pem
openssl pkey -in private.pem -pubout \
-outform DER -out public.der
Публичный PEM ↔ DER¶
openssl pkey -pubin -in public.pem -outform DER -out public.der
openssl pkey -pubin -inform DER -in public.der -out public-restored.pem
cmp <(openssl pkey -pubin -in public.pem -outform DER) \
<(openssl pkey -pubin -in public-restored.pem -outform DER)
Сертификат PEM ↔ DER¶
openssl x509 -in certificate.crt -outform DER -out certificate.der
openssl x509 -inform DER -in certificate.der -out certificate-restored.pem
openssl x509 -in certificate-restored.pem -noout -subject -issuer
CSR PEM ↔ DER¶
openssl req -in request.csr -outform DER -out request.der
openssl req -inform DER -in request.der -out request-restored.csr
openssl req -in request-restored.csr -noout -verify
PKCS#8: экспорт/обработка¶
openssl pkcs8 -topk8 -nocrypt -in private.pem \
-out private-pkcs8.pem
openssl pkey -in private-pkcs8.pem -check -noout
Флаг -nocrypt сохраняет незащищённый ключ: используйте этот пример только в изолированной лаборатории и ограничивайте права файла. Для закрытых ключей в работе применяйте защиту, описанную в политике ключей.
ASN.1 и OID¶
asn1parse показывает структуру и OID; он не подтверждает подлинность сертификата. Для реальной проверки используется openssl verify и политика доверия.
Почему перенос в другое ПО может не сработать¶
Причины обычно связаны с отсутствующим OID, неподдерживаемым paramset, устаревшей упаковкой ключа или несовместимой схемой защиты контейнера. Для КриптоПро проверьте отдельно тип PFX и его key bag: руководство.