SSL-сертификаты все плотнее входят в нашу жизнь и трудно представить современного администратора, никогда не имевшего с ними дело. Но, как показывает практика, работа с сертификатами все еще вызывает затруднение у многих наших коллег и виной тому недостаточный объем теоретических знаний. Наиболее частые сложности возникают с форматами сертификатов, поэтому мы сегодня решили внести ясность в этот вопрос и разобрать какие форматы сертификатов бывают и как можно выполнять преобразования между ними.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с 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.
Последние комментарии