Перейти к содержанию

Форматы ключей и сертификатов: 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

openssl asn1parse -in public.pem -i
openssl asn1parse -inform DER -in certificate.der -i | head -80

asn1parse показывает структуру и OID; он не подтверждает подлинность сертификата. Для реальной проверки используется openssl verify и политика доверия.

Почему перенос в другое ПО может не сработать

Причины обычно связаны с отсутствующим OID, неподдерживаемым paramset, устаревшей упаковкой ключа или несовместимой схемой защиты контейнера. Для КриптоПро проверьте отдельно тип PFX и его key bag: руководство.