Форматы сертификатов X.509 (SSL) и преобразования между ними

  • Автор:

convert-PEM-DER-PKCS7-PKCS12-certificates-000.pngSSL-сертификаты все плотнее входят в нашу жизнь и трудно представить современного администратора, никогда не имевшего с ними дело. Но, как показывает практика, работа с сертификатами все еще вызывает затруднение у многих наших коллег и виной тому недостаточный объем теоретических знаний. Наиболее частые сложности возникают с форматами сертификатов, поэтому мы сегодня решили внести ясность в этот вопрос и разобрать какие форматы сертификатов бывают и как можно выполнять преобразования между ними.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Форматы сертификатов

Начнем с того, что термин сертификат не является полностью корректным. Если мы говорим об инфраструктуре открытых ключей (PKI), то в ее основе лежит понятие ключевой пары - открытого и закрытого ключа. Сертификат - это средство распространения открытого ключа, которое содержит сам открытый ключ и ряд дополнительной информации. Сертификат является публичным и общедоступным. Закрытый ключ, наоборот, секретная информация и должен храниться в безопасном месте.

Но, как говорится, из песни слов не выкинешь и понятие сертификат широко используется и специалистами, и простыми пользователями в самом широком смысле: подразумевая и сам сертификат, и ключ сертификата, и полностью ключевую пару. Поэтому, каждый раз, когда вам встречается это слово, то нужно, прежде всего определиться в каком контексте оно употребляется и что именно значит.

Также при работе с сертификатами вам обязательно встретится аббревиатура X.509, это стандарт для сертификатов и ключей PKI, определяющий их формат, структуру и способы работы с ними. Поэтому, когда речь идет о X.509, то мы понимаем, что это сертификаты PKI.

Но перейдем к форматам. Серьезную путаницу вносит то, что расширения сертификатов и ключей не всегда четко указывают на формат, точнее даже наоборот и точно убедиться с чем именно вы имеете дело можно только ознакомившись с содержимым. Мы не будем рассматривать все возможные варианты форматов, ограничимся только самыми ходовыми.

Формат DER

Это бинарный формат для сертификатов и ключей, фактически он является исходным, так как изначально ключи - это некоторые бинарные сущности. Чаще всего используется на платформе Java и в Windows, там это формат по умолчанию. Могут использовать расширения .der и .cer, но ничего не мешает дать такому файлу другое широко используемое расширение.

Поэтому для выяснения формата файла следует просмотреть его содержимое или воспользоваться командой file в Linux:

file mycert.cer 

Если сертификат бинарный, то в ответ вы получите:

mycert.cer: data

Все тоже самое справедливо и для закрытого ключа, который чаще всего имеет расширение .key.

Формат PEM

Данный формат наиболее популярен и распространен, особенно в открытом ПО. Представляет кодированный при помощи Base64 формат DER и по сути является обычным текстовым файлом. Характерными особенностями являются обязательные строки, между которыми находится содержимое сертификата или ключа:

-----BEGIN CERTIFICATE-----
Содержимое сертификата Base64 ASCII
-----END CERTIFICATE-----

А команда file определяет такой файл как:

mycert.crt: ASCII text, with CRLF line terminators

Контейнер в формате PEM может содержать один или несколько сертификатов, закрытый ключи или сертификат(ы) и закрытый ключ одновременно. В этом случае каждый из них обрамляется обязательными строками BEGIN и END. Кроме расширения .pem могут также использоваться .cer, .crt и .key для ключа. Поэтому определять формат следует по типу содержимого.

Формат PKCS #7

Специальный контейнер, предназначенный для хранения сертификатов и/или списков отзыва (CRL), может иметь расширения .p7b или .p7c. Важной особенностью является то, что данный формат не предназначен для хранения закрытого ключа и используется только для сертификатов. Чаще всего используется в Windows системах.

Может иметь как DER, так и PEM формат, в последнем случае файл имеет обязательные строки:

-----BEGIN PKCS7-----
Содержимое Base64 ASCII
-----END PKCS7-----

Данный контейнер в основном определяется по расширению, а его внутренний формат по содержимому.

Формат PKCS #12

Данный формат предназначен для хранения закрытого ключа и сертификата, кроме них может содержать полную цепочку доверия и список отзыва. Часто используется для распространения и хранения ключевой пары. Наибольшее распространение имеет в Windows системах и является дальнейшим развитием контейнера PFX от Microsoft, в настоящий момент эти аббревиатуры употребляются как синонимы.

Имеет бинарный формат и защищен паролем (можно оставить пустой пароль), определяется по расширениям .pfx, .p12, .pkcs12.

Преобразование форматов

Для всех дальнейших действий мы будем использовать OpenSSL на платформе Linux, для работы в среде Windows вам потребуется несколько изменить синтаксис в части определения путей. Все команды выполняются от имени того пользователя, который является владельцем сертификата. Также помним, что форматом по умолчанию для OpenSSL является PEM.

PEM в DER

Для преобразования сертификата из PEM в DER выполните:

openssl x509 -in cert.pem -out cert.der -outform DER

Для закрытого ключа:

openssl rsa -in privkey.pem -out privkey.der -outform DER

Для получения нужного результата мы явно указываем выходной формат - DER.

DER в PEM

Синтаксис команд схож, для сертификата:

openssl x509 -inform DER -in cert.der -out cert.pem

Для закрытого ключа:

openssl rsa -inform DER -in privkey.der -out privkey.pem

Обратите внимание, что в данной команде мы, наоборот, явно указываем входной формат.

PEM в PKCS #7

Для примера объединим два сертификата: собственно наш сертификат и сертификат удостоверяющего центра.

openssl crl2pkcs7 -nocrl -certfile cert.pem -certfile cacert.pem -out cert.p7c

Ключ -nocrl указывает, что мы не включаем в контейнер список отзыва. Каждый включаемый в контейнер сертификат задается отдельной опцией -certfile.

Для создания контейнера с CRL используем команду:

openssl crl2pkcs7 -in crl.pem -certfile cert.pem -certfile cacert.pem -out cert.p7c

Так как мы не указывали ни входной, ни выходной форматы, то на входе используем сертификаты формата PEM и получаем контейнер с тем же форматом. Для получения файла в формате DER укажите:

openssl crl2pkcs7 -nocrl -certfile cert.pem -certfile cacert.pem -out cert.p7c -outform DER

Преобразовать сертификаты в формате DER сразу в PKCS #7 нельзя, их следует сначала преобразовать в формат PEM.

PEM в PKCS #12

Создадим контейнер, в который поместим собственно ключевую пару и дополнительный сертификат CA:

openssl pkcs12 -export -in cert.pem -inkey privkey.pem -certfile cacert.pem -out cert.p12

В ключе -in указываем сертификат, связанный с закрытым ключом, в -inkey - закрытый ключ, затем добавляем нужное количество опций -certfile для включения дополнительных сертификатов, которые будут формировать цепочку доверия.

PKCS #7 в PEM

Мы можем вывести все сертификаты файла PKCS #7 в PEM командой:

openssl pkcs7 -print_certs -in cert3.p7b -out certs.pem

Если исходный файл в формате DER, то добавьте:

openssl pkcs7 -print_certs -inform DER -in cert3.p7b -out certs.pem

Напоминаем, что определять формат PKCS #7 следует по содержимому.

PKCS #12 в PEM

Данный контейнер может содержать как ключевую пару, так и дополнительные сертификаты, чтобы вывести их все в формат PEM используйте команду:

openssl pkcs12 -in cert.p12 -out certs.pem -nodes

Последний ключ -nodes указывает на то, что не нужно шифровать закрытый ключ.

Но что, если нам нужно получить только отдельные части контейнера? Ничего сложного.

Для вывода только сертификата и закрытого ключа используйте:

openssl pkcs12 -in cert.p12 -clcerts -out certs.pem -nodes

Только сертификата:

openssl pkcs12 -in cert.p12 -clcerts -out cert.pem -nodes -nokeys

Так как мы не извлекаем ключ, то опция -nodes как бы не нужна, но она подавляет появления запроса на пароль для экспортируемого файла.

Для вывода только сертификата(ов) CA:

openssl pkcs12 -in cert.p12 -cacerts -out cacert.pem -nodes -nokeys

Только закрытого ключа:

openssl pkcs12 -in cert.p12 -out privkey.pem -nodes -nocerts

Как видим, при помощи OpenSSL не составляет никакого труда разобрать контейнер PKCS #12 на составляющие.

Установить / снять пароль с закрытого ключа

Еще одна часто встречающаяся задача: снять пароль с закрытого ключа, для этого используйте команду:

openssl rsa -in privkey.key -out privkey-nopass.key

Обратная операция выполняется командой:

openssl rsa -des3 -in privkey.key -out privkey-pass.key

Где -des3 указывает на алгоритм шифрования, допустимы значения: -aes128, -aes192, -aes256, -aria128, -aria192, -aria256, -camellia128, -camellia192, -camellia256, -des, -des3, -idea. Перед их использованием следует уточнить, какие именно из них поддерживает тот софт, с которым вы собираетесь использовать ключ.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Поддержи автора и новые статьи будут выходить чаще:

Поддержи проект!

Или подпишись на наш Телеграм-канал: Подпишись на наш Telegram-канал



Loading Comments