ФОРМАТ SSL СЕРТИФИКАТА: КАК КОНВЕРТИРОВАТЬ СЕРТИФИКАТ В .PEM, .CER, .CRT, .DER, PKCS ИЛИ PFX? – Записная книжка инженера программиста

ФОРМАТ SSL СЕРТИФИКАТА: КАК КОНВЕРТИРОВАТЬ СЕРТИФИКАТ В .PEM, .CER, .CRT, .DER, PKCS ИЛИ PFX? - Записная книжка инженера программиста Сертификаты

Что происходит по истечении срока действия ssl-сертификата?

Срок действия SSL-сертификатов истекает, он не длится вечно. Центр сертификации / Форум браузеров, который де-факто выступает в качестве регулирующего органа для индустрии SSL, заявляет, что срок действия SSL-сертификатов не должен превышать 27 месяцев.

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

Раньше SSL-сертификаты могли выдаваться на срок до пяти лет, который впоследствии был сокращен до трех лет, а в последнее время до двух лет плюс возможность использовать дополнительные три месяца. В 2020 году Google, Apple и Mozilla объявили, что будут применять годовые SSL-сертификаты, несмотря на то, что это предложение было отклонено Центрами сертификации / Форумом браузеров.

Когда срок действия SSL-сертификата истекает, соответствующий сайт становится недоступным. Когда пользователь открывает веб-сайт в браузере, в течение нескольких миллисекунд проверяется действительность SSL-сертификата (в рамках подтверждения SSL-соединения).

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

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

Поэтому причиной того, что компания допустила истечение срока действия своего SSL-сертификата, обычно является недосмотр, а не отсутствие компетентности. Лучший способ для крупных компаний поддерживать осведомленность об истечении срока действия SSL-сертификатов – использовать платформу управления сертификатами.

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

Если срок действия сертификата истечет, сертификат станет недействительным, и выполнять безопасные транзакции на веб-сайте станет невозможно. Центр сертификации предложит обновить SSL-сертификат до истечения срока его действия.

Все центры сертификации и службы SSL, используемые для получения SSL-сертификатов, отправляют уведомления об истечении срока действия сертификата с заданной периодичностью, обычно начиная с 90 дней до окончания срока действия сертификата. Постарайтесь, чтобы эти уведомления отправлялись на несколько адресов электронной почты, а не одному человеку, который к моменту отправки уведомления может покинуть компанию или перейти на другую должность. Убедитесь, что соответствующие сотрудники компании включены в список рассылки и своевременно получат уведомление.

Выпускаем собственные сертификаты

Теперь, когда мы разобрали теорию, самое время приступить к практике! Нам понадобятся OpenSSL и keytool (входит в поставку JDK). Для начала создадим сертификат корневого CA, которым будем подписывать запросы на подпись сертификата клиента и сервера. Сгенерируем приватный ключ RSA зашифрованный AES 256 с паролем “password” длиной 4096 бит (меньше 1024 считается ненадежным) в файл CA-private-key.key:

openssl genrsa -aes256 -passout pass:password -out CA-private-key.key 4096

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

Далее создадим новый запрос на подпись сертификата CA-certificate-signing-request.csr, передавая информацию о субъекте “CN=Certificate authority” (если не указывать ключ -subj вас попросят указать: Сountry (C), Locality (L), Organisation (O), Organisation Unit (OU), Common Name (CN), Email, Challenge password – все поля, кроме CN опциональны), приватный ключ и пароль от него:

openssl req -new -key CA-private-key.key -passin pass:password -subj "/CN=Certificate authority/" -out CA-certificate-signing-request.csr t $3

Так как подписать сертификат другим сертификатом пока нельзя, подпишем запрос его же приватным ключом. Получившейся сертификат CA-self-signed-certificate.pem будет самоподписанным со сроком действия 1 день.

openssl x509 -req -in CA-certificate-signing-request.csr -signkey CA-private-key.key -passin pass:password -days 1 -out CA-self-signed-certificate.pempemE

Теперь у нас есть сертификат, которому в будущем будут доверять наши клиент и сервер. Похожим образом сделаем приватные ключи и запросы на подпись сертификата для них:

openssl genrsa -aes256 -passout pass:password -out Server-private-key.key 4096
openssl req -new -key Server-private-key.key -passin pass:password -subj "/CN=localhost/" -out Server-certificate-signing-request.csrt $3

openssl genrsa -aes256 -passout pass:password -out Client-private-key.key 4096
openssl req -new -key Client-private-key.key -passin pass:password -subj "/CN=Client/" -out Client-certificate-signing-request.csr

Подпишем запросы нашим сертификатом CA. Ключ CAcreateserial отвечает за создание файла (в данном случае CA-self-signed-certificate.srl) , в котором будет храниться серийный номер для следующего подписываемого этим сертификатом запроса. Серийный номер для текущего же сертификата сгенерируется случайно.

openssl x509 -req -in Server-certificate-signing-request.csr -CA CA-self-signed-certificate.pem -CAkey CA-private-key.key -passin pass:password -CAcreateserial -days 1 -out Server-certificate.pemt $4
openssl x509 -req -in Client-certificate-signing-request.csr -CA CA-self-signed-certificate.pem -CAkey CA-private-key.key -passin pass:password -days 1 -out Client-certificate.pem

После этого необходимо создать хранилище ключей с сертификатами (keystore) Server-keystore.p12 для использования в нашем приложении. Положим туда сертификат сервера, приватный ключ сервера и защитим хранилище паролем “password”:

openssl pkcs12 -export -in Server-certificate.pem -inkey Server-private-key.key -passin pass:password -passout pass:password -out Server-keystore.p12      

Осталось только создать хранилище доверенных сертификатов (truststore): сервер будет доверять всем клиентам, в цепочке подписания которых есть сертификат из truststore. К сожалению, для Java сертификаты в truststore должны содержать специальный object identifier, а OpenSSL пока не поддерживает их добавление. Поэтому здесь мы прибегнем к поставляемому вместе с JDK keytool:

keytool -import -file CA-self-signed-certificate.pem -keystore Server-truststore.p12 -storetype PKCS12 -storepass password -noprompt    

Для удобства, все описанные выше действия упакованы в bash script.

Глава вторая: ещё одна эп

Порывшись в почте, я нашел еще один электронный договор. По счастливой случайности, им тоже оказался страховой полис, но на этот раз еОСАГО от АО “Тинькофф Страхование”. Открываем сертификат, смотрим выпустившую сертификат организацию. Ей оказывается АО “Тинькофф банк”.

По отработанному алгоритму идём в поисковую систему с запросом “тинькофф сертификат”, находим официальный сайт УЦ АО Тинькофф Банк. Тут нас встречает изобилие ссылок на корневые сертификаты, списки отозванных сертификатов и даже видеоинструкция по их установке.

Скачиваем “Цепочка корневых сертификатов УЦ АО Тинькофф Банк ГОСТ Р 34.10.2021”, на этот раз ссылка ведёт не на сторонний сервис, а на сайт банка. Формат файла P7B не очень известный, но открывается Windows без установки стороннего софта и показывает находящиеся в нём сертификаты.

Ставим оба, проверяем сертификат в полисе. Но нет, сертификат не является доверенным, т.к. система не может подтвердить поставщика сертификата. На сайте УЦ было 2 ссылки на 2 цепочки сертификатов, один для ГОСТ Р 34.10.2001, другой для ГОСТ Р 34.10.2021.

В новом файле формата P7B оказывается уже 3 файла сертификатов. Можно поставить все 3, однако стоит заметить, что сертификат “Головного удостоверяющего центра” мы поставили в первой главе из RAR архива ООО “ИТК”, они идентичны. А сертификат с не очень говорящим названием “УЦ 1 ИС ГУЦ” поставил КриптоПро CSP, т.к. галочка об установке корневых сертификатов была установлена по-умолчанию в его инсталляторе. Единственным новым является сертификат АО “Тинькофф Банк”, который мы и ставим.

После установки сертификатов из “Цепочка корневых сертификатов УЦ АО Тинькофф Банк ГОСТ Р 34.10.2001” путь в сертификате прорисовался и система радостно сообщила, что он является доверенным. Adobe Acrobat Reader DC также подтвердил, что подпись действительна.

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

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

Команды openssl для преобразования сертификатов на своём компьютере

Перевод:

SSL Converter

Воспользуйтесь этим преобразователем SSL для преобразования сертификатов SSL между различными форматами, такими как pem, der, p7b и pfx.

Про сертификаты:  Вопросы и ответы | Национальное бюро кредитных историй

Разные платформы и устройства требуют преобразовывать сертификаты SSL в разные форматы. Например, Windows-сервер экспортирует и импортирует файлы .pfx, а сервер Apache использует отдельные файлы PEM (.crt, .cer). Чтобы воспользоваться преобразователем SSL, просто выберите файл сертификата и его текущий тип (произойдёт попытка определить тип по расширению файла), затем выберите тип, в который нужно преобразовать сертификат и нажмите Преобразовать сертификат. Подробности о различных типах сертификатов SSL и о том, как можно преобразовать сертификаты на своём компьютере с помощью OpenSSL, смотрите ниже.

Формат PEM

Формат PEM – наиболее распространённый формат сертификатов, выпускаемых удостоверяющими центрами. Сертификаты PEM обычно имеют расширения .pem, .crt, .cer и .key. Это ASCII-файлы с информацией, закодированной в Base64, и содержащие выражения “—–BEGIN CERTIFICATE—–” и “—–END CERTIFICATE—–“. Сертификаты сервера, промежуточные сертификаты и приватные ключи могут быть записаны в формате PEM.

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

Формат DER

Формат DER – это просто двоичный вид сертификата, в отличие от PEM, который закодирован в символы ASCII. Иногда встречается расширение файла .der, но чаще у файла бывает расширение .cer. Чтобы узнать, имеет ли этот файл формат DER или PEM, можно открыть его в текстовом редакторе и поискать выражения BEGIN и END. Все типы сертификатов и приватных ключей могут быть представлены в формате DER. Обычно DER используется на платформе Java. Инструмент для преобразования SSL умеет преобразовывать в формат DER только сертификаты. Если нужно преобразовать в формат DER приватный ключ, воспользуйтесь командами OpenSSL, приведёнными на этой странице.

Формат PKCS#7/P7B

Формат PKCS#7 или P7B обычно сохраняется в виде ASCII, закодированным в Base64, и имеет расширение .p7b или .p7c. Сертификаты P7B содержат выражения “—–BEGIN PKCS7—–” и “—–END PKCS7—–“. Файл P7B содержит только сертификаты и цепочки сертификатов, но не приватные ключи. Некоторые платформы поддерживают файлы P7B, в том числе Microsoft Windows и Java Tomcat.

Формат PKCS#12/PFX

Формат PKCS#12 или PFX – это двоичный формат для хранения сертификата сервера, промежуточных сертификатов и приватного ключа в одном зашифрованном файле. Файлы PFX обычно имеют расширение .pfx или .p12. Файлы PFX обычно используются на компьютерах под управлением Windows для импорта и экспорта сертификатов и приватных ключей.

При преобразовании файла PFX в формат PEM, OpenSSL поместит все сертификаты и приватный ключ в один файл. Для этого нужно открыть файл в текстовом редакторе и скопировать каждый сертификат и приватный ключ (включая выражения BEGIN/END) в отдельные текстовые файлы и сохранить их под именами certificate.cer, CACert.cer и privateKey.key соответственно.

Команды OpenSSL для преобразования сертификатов SSL на своём компьютере

Настоятельно рекомендуется преобразовывать файлы .pfx на своём компьютере с помощью OpenSSL. Это позволит сохранить приватный ключ в тайне. Воспользуйтесь следующими командами OpenSSL для преобразования сертификата SSL в различные форматы на своём компьютере:

Преобразование PEM с помощью OpenSSL

Преобразование DER с помощью OpenSSL
Преобразование P7B с помощью OpenSSL
Преобразование PFX с помощью OpenSSL

Конвертирование сертификатов при помощи openssl

Как только возникает необходимость выполнить конвертирование одного формата сертификата в другой, каждый раз возникает вопрос: “Как это сделать?”. Наиболее удобно для этого использовать OpenSSL (

openssl.org

), этот сайт содержит исходные коды, если нет желания выполнять компилирование исходных кодов, то можно взять скомпилированный вариант OpenSSL, его можно скачать по ссылке: 

https://slproweb.com/products/Win32OpenSSL.html

. Необходимость выполнять конвертирование возникает, если имеющийся формат сертификата не подходит для ПО или оборудования.

Итак, если необходимо выполнить конвертирование одного формата сертификата в другой, то надо скачать и установить OpenSSL на локальном компьютере. Далее, рекомендуется скопировать с папку с OpenSSL имеющиеся файлы сертификата, для которого необходимо выполнить конвертирование, открыть командную строку и перейти в папку с установленным OpenSSL. 

Рекомендуется запускать командную строку с от имени администратора (Run As Administrator), это позволит избежать возможных ошибок, если на машине включен UAC.

Для выполнения конвертирования необходимо выполнить одну (или две) команду из списка ниже, в зависимости от исходного формата сертификата и целевого.

Конвертирование x509 в PEM

openssl x509 -in certificate.cer -outform PEM -out certificate.pem 

Конвертирование PEM в DER

openssl x509 -outform der -in certificate.pem -out certificate.der 

Конвертирование DER в PEM

openssl x509 -inform der -in certificate.der -out certificate.pem 

Конвертирование PEM в  P7B

openssl crl2pkcs7 -nocrl -certfile certificate.pem -out certificate.p7b -certfile CACert.cer 

Конвертирование PKCS7 в PEM

openssl pkcs7 -print_certs -in certificate.p7b -out certificate.pem 

Конвертирование pfx в PEM

openssl pkcs12 -in certificate.pfx -out certificate.pem 

Конвертирование PFX в PKCS#8

Для этого требуется выполнение двух команд

Step 1:Конвертирование PFX в PEM

openssl pkcs12 -in certificate.pfx -nocerts -nodes -out certificate.pem 

Step 2:Конвертирование PEM в PKCS8

openSSL pkcs8 -in certificate.pem -topk8 -nocrypt -out certificate.pk8 

Конвертирование P7B в PFX

Для этого требуется выполнение двух команд

1. Конвертирование P7B в CER

openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer

2. Конвертирование CER и закрытого ключа в PFX

openssl pkcs12 -export -in certificate.cer -inkey privateKey.key -out certificate.pfx -certfile  cacert.cer 

cacert.cer – это файл сертификата выдающего центра сертификации (Intermediate CAs)

Печать подарочных сертификатов, заказать изготовление подарочных сертификатов москва

Внимание! в окошке «количество», в котором указывается необходимый Вам тираж – указывается количество одного вида, а не суммарное количество всех нужных Вам видов подарочных сертификатов.
Если Вам необходимо сделать заказ из нескольких видов (нескольких макетов) подарочных сертификатов, то Вам нужно в одном заказе (в одной корзине) заказать необходимое Вам количество видов подарочных сертификатов.
Минимальная стоимость каждого вида в заказе – 500 р (при сумме заказа менее 500 р, произойдет автоматическое увеличение цены одного вида до 500 р), обратите, пожалуйста на это особое внимание.

Небольшая инструкция для удобства использования нашего калькулятора печати и изготовления подарочных сертификатов . Чтобы сделать расчет в онлайн-калькуляторе, узнать стоимость печати подарочных сертификатов и заказать их онлайн на нашем сайте, нужно последовательно нажать всего лишь несколько кнопок. Это действительно просто, но если Вы не хотите или Вам сложно, мы всегда с радостью поможем Вам в расчете и заказе подарочных сертификатов по телефону, электронной почте или лично, у нас в офисе. Вы также можете нажать на слайдере выше кнопку “Быстрый заказ”, ввести свои пожелания и мы сами с вами свяжемся с уже готовым расчетом.

«Способ заказа» – для начала работы с калькулятором, выберите из трех указанных ниже вариантов способа заказа

  • «Создам дизайн по шаблону онлайн» – выбрав данный пункт, Вы сможете использовать наши бесплатные шаблоны подарочных сертификатов, добавить в них свою информацию, самостоятельно создать дизайн и заказать дипломы и сертификаты, а также создать макет с нуля.
  • «Есть готовый макет» – если у Вас есть свой макет подарочных сертификатов, Вам нужно выбрать этот пункт, мы бесплатно проверим его на нашем сайте онлайн или непосредственно в нашей типографии перед печатью.
  • «Закажу дизайн в Digital-Printing.ru» – если Вам необходимо создать или заказать дизайн подарочных сертификатов, и Вы не хотите делать это самостоятельно, то выбирайте данную кнопку, стоимость дизайна будет указана ниже при выборе этого способа заказа.
  • «Размер подарочных сертификатов» – для выбора размера подарочных сертификатов, для Вашего удобства, размеры в калькуляторе указаны до, определенного формата и до включая этот же формат, т.е., если Вам необходим размер подарочных сертификатов, к примеру, 200×290 мм, то Вам необходимо выбрать А4, и если Вы хотите подарочных сертификатов размером А4, то Вам также необходимо выбрать А4
  • «Выберите, бумагу для подарочных сертификатов» – в данном разделе, будет предложено выбрать материал из которых будут изготовлены дипломы и сертификаты

  • «115 гр – 300 гр» – это мелованная бумага, фабрики UPM, Германия, MAXI – чистоцеллюлозная глянцевая и матовая мелованная бумага, отбелена бесхлорным способом
  • «Дизайнерская» – это различные бумаги, с тиснением, эффектом металлика, крафт или калька, пергамент или картон. В общем, все что нестандартно – в этом разделе.
  • «Покрыть защитно-декоративной пленкой (ламинация)» – в данном пункте Вы можете выбрать для подарочных сертификатов глянцевую ламинацию (делает изображения ярче), матовую ламинацию (сглаживает яркость цветов, добавляя солидности и строгости продукции) и, конечно, новаторскую супер-премиальную софт-тач ламинацию, создающую тактильный эффект латексного покрытия.

    Про сертификаты:  Нож Старшина VD74B - купить в интернет магазине

    «Добавить печать золотом, серебром или белым цветом (для некоторых продуктов)» – предлагаем вам уникальную услугу, – мы можем напечатать золотом или серебром, на поверхности Ваших подарочных сертификатов. В рамках краткого описания очень сложно объяснить, как это будет выглядеть, но, поверьте, это очень круто и стоит совсем недорого, если Вам нужно что-то необычное и премиальное – эта опция для Вас.

    «Нумерация и персонализация» – данный параметр предназначен для выбора дополнительной услуги по персонализации (печати переменных данных) или нумерации подарочных сертификатов

  • «Нумерация» – для того, чтобы пронумеровать дипломы и сертификаты, к примеру, в диапазоне от 1 до 100, необходимо выбрать эту опцию и в дальнейшем, при заказе указать в комментариях к заказу в личном кабинете, какой диапазон необходим
  • «Персонализация (включая нумерацию)» – если необходимо не только пронумеровать или предполагается печать переменных данных, таких как, – ФИО, адресов получателей, или промокодов, необходимо выбрать эту опцию и приложить к заказу в личном кабинете (после оформления заказа) файл в экселе с переменными данными.
  • «Срок исполнения заказа» – укажите срок, когда Вам нужен готовый заказ, который напрямую влияет на конечную стоимость наклеек – от нескольких дней, до 24 часов и даже 2 часов. Под сроком понимаются рабочие дни и часы.

    «Биговка» – специальная операция по созданию в бумаге канавки (биговки), которая в дальнейшем, позволит бумаге сложиться и не сломаться, не треснуть на сгибе. К примеру, подарочные сертификаты с сложением, имеют как раз такую специальную канавку. Если на плотных бумагах эту операцию не делать, и попытаться сложить, то бумага на месте сгиба сломается. Биговка применяется обычно для бумаг плотностью 170гр и более.

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

    Часть 1. самоподписанный сертификат

    Для начала рассмотрим вариант самоподписанного сертификата корневого уровня.

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

    Сделать это можно с помощью библиотеки Bouncy Castle, следующим образом:

    private void button1_Click(object sender, EventArgs e)
            {            
    
                var KeyGenerate = new RsaKeyPairGenerator();
    
                KeyGenerate.Init(new KeyGenerationParameters(new SecureRandom(new CryptoApiRandomGenerator()), 1024));
    
                AsymmetricCipherKeyPair kp = KeyGenerate.GenerateKeyPair();
    
                var gen = new X509V3CertificateGenerator();
    
                var certName = new X509Name("CN=CA");
                var serialNo = new BigInteger("1",10);            
    
                gen.SetSerialNumber(serialNo);
                gen.SetSubjectDN(certName);            
                gen.SetIssuerDN(certName);
                gen.SetNotAfter(DateTime.Now.AddYears(100));
                gen.SetNotBefore(DateTime.Now);
                gen.SetSignatureAlgorithm("SHA1WITHRSA");            
                gen.SetPublicKey(kp.Public);     
                var myCert = gen.Generate(kp.Private);
                byte[] result = DotNetUtilities.ToX509Certificate(myCert).Export(X509ContentType.Cert);
    
                FileStream fs = new FileStream("D:\test1.crt", FileMode.CreateNew);
                fs.Write(result, 0, result.Length);
                fs.Flush();
                fs.Close();
            }
    

    В результате выполнения данной процедуры будет создан стандартный x.509 сертификат, который, будучи открытым с помощью hex-редактора, выглядит вот таким чудесным образом:

    30 82 01 8F 30 81 F9 A0  03 02 01 02 02 01 01 30
    0D 06 09 2A 86 48 86 F7  0D 01 01 05 05 00 30 0D
    31 0B 30 09 06 03 55 04  03 0C 02 43 41 30 20 17
    0D 31 33 30 39 31 35 31  35 33 35 30 32 5A 18 0F
    32 31 31 33 30 39 32 32  31 35 33 35 30 32 5A 30
    0D 31 0B 30 09 06 03 55  04 03 0C 02 43 41 30 81
    9F 30 0D 06 09 2A 86 48  86 F7 0D 01 01 01 05 00
    03 81 8D 00 30 81 89 02  81 81 00 8D 80 B5 8E 80
    8E 94 D1 04 03 6A 45 1A  54 5E 7E EE 6D 0C CB 0B
    82 03 F1 7D C9 6F ED 52  02 B2 08 C3 48 D1 24 70
    C3 50 C2 1C 40 BC B5 9D  F8 E8 A8 41 16 7B 0B 34
    1F 27 8D 32 2D 38 BA 18  A5 31 A9 E3 15 20 3D E4
    0A DC D8 CD 42 B0 E3 66  53 85 21 7C 90 13 E9 F9
    C9 26 5A F3 FF 8C A8 92  25 CD 23 08 69 F4 A2 F8
    7B BF CD 45 E8 19 33 F1  AA E0 2B 92 31 22 34 60
    27 2E D7 56 04 8B 1B 59  64 77 5F 02 03 01 00 01
    30 0D 06 09 2A 86 48 86  F7 0D 01 01 05 05 00 03
    81 81 00 0A 1C ED 77 F4  79 D5 EC 73 51 32 25 09
    61 F7 00 C4 64 74 29 86  5B 67 F2 3D A9 39 34 6B
    3C A9 92 B8 BF 07 13 0B  A0 9B DF 41 E2 8A F6 D3
    17 53 E1 BA 7F C0 D0 BC  10 B7 9B 63 4F 06 D0 7B
    AC C6 FB CE 95 F7 8A 72  AA 10 EA B0 D1 6D 74 69
    5E 20 68 5D 1A 66 28 C5  59 33 43 DB EE DA 00 80
    99 5E DD 17 AC 43 36 1E  D0 5B 06 0F 8C 6C 82 D3
    BB 3E 2B A5 F1 94 FB 53  7B B0 54 22 6F F6 4C 18
    1B 72 1C
    

    Тот же самый сертификат, но уже открытый с помощью стандартных средств windows:

    Имя сертификата	CA
    Издатель	CA
    Версия сертификата	3
    Серийный номер	0x1
    Недействителен до...	15.09.2021 15:35:00 GMT
    Недействителен после...	22.09.2113 15:35:00 GMT
    Цифровая подпись (SHA-1)	F9 AD 58 B5 50 3D F6 36 5E B8 89 D4 DC C8 5F CC 25 4B 93 A2
    Цифровая подпись (SHA-256)	42 02 24 20 4E 8F 3A 3E 31 38 88 E5 C5 E7 C3 03 14 3A A6 52 EA 78 B9 77 42 5B 99 EB 4B BA 23 82
    Открытый ключ(1024 битный)		Алгоритм открытого ключа	rsaEncryption
    Модуль	
    00: 8D 80 B5 8E 80 8E 94 D1 04 03 6A 45 1A 54 5E 7E
    10: EE 6D 0C CB 0B 82 03 F1 7D C9 6F ED 52 02 B2 08
    20: C3 48 D1 24 70 C3 50 C2 1C 40 BC B5 9D F8 E8 A8
    30: 41 16 7B 0B 34 1F 27 8D 32 2D 38 BA 18 A5 31 A9
    40: E3 15 20 3D E4 0A DC D8 CD 42 B0 E3 66 53 85 21
    50: 7C 90 13 E9 F9 C9 26 5A F3 FF 8C A8 92 25 CD 23
    60: 08 69 F4 A2 F8 7B BF CD 45 E8 19 33 F1 AA E0 2B
    70: 92 31 22 34 60 27 2E D7 56 04 8B 1B 59 64 77 5F
    Экспонента	01 00 01                                       
    
    Подпись		Алгоритм подписи	sha1WithRSAEncryption
    Подпись	
    00: 0A 1C ED 77 F4 79 D5 EC 73 51 32 25 09 61 F7 00
    10: C4 64 74 29 86 5B 67 F2 3D A9 39 34 6B 3C A9 92
    20: B8 BF 07 13 0B A0 9B DF 41 E2 8A F6 D3 17 53 E1
    30: BA 7F C0 D0 BC 10 B7 9B 63 4F 06 D0 7B AC C6 FB
    40: CE 95 F7 8A 72 AA 10 EA B0 D1 6D 74 69 5E 20 68
    50: 5D 1A 66 28 C5 59 33 43 DB EE DA 00 80 99 5E DD
    60: 17 AC 43 36 1E D0 5B 06 0F 8C 6C 82 D3 BB 3E 2B
    70: A5 F1 94 FB 53 7B B0 54 22 6F F6 4C 18 1B 72 1C
    

    Имея два этих файла, один с двоичными данными, а другой с описанием сертификата, попробуем разобраться что здесь к чему.

    Про сертификаты:  Создание SSL-сертификата веб-сервера Apace на Ubuntu 12.04 |

    Прежде всего, нужно отметить, что файл *.crt хранит информацию о сертификате в закодированном виде. Для кодирования применяется особый язык, называемый ASN.1.

    ASN.1 — стандарт записи, описывающий структуры данных для представления, кодирования, передачи и декодирования данных. Wikipedia

    С помощью языка ASN.1 можно описывать сложные структуры, состоящие из данных различных типов. Типичный пример ASN.1-файла выглядит как-то так:

    Однако ASN.1 разрабатывался в те светлые времена, когда «640 КБ должно было хватать каждому» и тратить место на такую громоздкую запись не было никакой возможности. Поэтому, в целях экономии места, а также более удобной обработки хранимой в ASN.1-форме информации, был разработан специальный метод кодирования — DER.

    DER-кодировка описывается следующим правилом. Первым записывается байт, характеризующий тип данных, затем последовательность байтов хранящих сведения о длине данных и затем уже записываются сами данные.

    К примеру, для кодировки целого числа INTEGER 65537 используется следующая форма: 0203 01 00 01.Здесь первый байт 02, определяет тип INTEGER (полную таблицу типов вы можете найти например тут), второй байт 03 показывает длину блока. А следующие за этим байты 01 00 01, являются шестнадцатеричной записью нашего числа 65537.

    В нашем случае, для описание простейшего самоподписаного сертификата, достаточно 9 типов данных. Приведем таблицу кодирования для этих типов:

    Зная как кодируется каждый из этих типов, мы можем попытаться распарсить наш *.crt файл.

    3082 01 8F3081 F9A0030201 02 0201 01 30
    0D0609 2A 86 48 86 F7 0D 01 01 05 0500300D
    310B30090603 55 04 03 0C02 43 41 302017
    0D 31 33 30 39 31 35 31 35 33 35 30 32 5A 180F
    32 31 31 33 30 39 32 32 31 35 33 35 30 32 5A 30
    0D310B30090603 55 04 03 0C02 43 41 3081
    9F 300D0609 2A 86 48 86 F7 0D 01 01 01 0500
    0381 8D 00 3081 890281 81 00 8D 80 B5 8E 80
    8E 94 D1 04 03 6A 45 1A 54 5E 7E EE 6D 0C CB 0B
    82 03 F1 7D C9 6F ED 52 02 B2 08 C3 48 D1 24 70
    C3 50 C2 1C 40 BC B5 9D F8 E8 A8 41 16 7B 0B 34
    1F 27 8D 32 2D 38 BA 18 A5 31 A9 E3 15 20 3D E4
    0A DC D8 CD 42 B0 E3 66 53 85 21 7C 90 13 E9 F9
    C9 26 5A F3 FF 8C A8 92 25 CD 23 08 69 F4 A2 F8
    7B BF CD 45 E8 19 33 F1 AA E0 2B 92 31 22 34 60
    27 2E D7 56 04 8B 1B 59 64 77 5F 0203 01 00 01
    300D0609 2A 86 48 86 F7 0D 01 01 05 050003
    81 81 00 0A 1C ED 77 F4 79 D5 EC 73 51 32 25 09
    61 F7 00 C4 64 74 29 86 5B 67 F2 3D A9 39 34 6B
    3C A9 92 B8 BF 07 13 0B A0 9B DF 41 E2 8A F6 D3
    17 53 E1 BA 7F C0 D0 BC 10 B7 9B 63 4F 06 D0 7B
    AC C6 FB CE 95 F7 8A 72 AA 10 EA B0 D1 6D 74 69
    5E 20 68 5D 1A 66 28 C5 59 33 43 DB EE DA 00 80
    99 5E DD 17 AC 43 36 1E D0 5B 06 0F 8C 6C 82 D3
    BB 3E 2B A5 F1 94 FB 53 7B B0 54 22 6F F6 4C 18
    1B 72 1C


    Преобразуя байты-идентификаторы типов и убирая байты описывающие длину блоков получим следующую структуру:

    SEQUENCE(3 elem)
    	SEQUENCE(7 elem)
    		[0](1 elem)
    			INTEGER 2
    		INTEGER 1
    		SEQUENCE(2 elem)
    			OBJECT IDENTIFIER 1.2.840.113549.1.1.5
    			NULL
    		SEQUENCE(1 elem)
    			SET(1 elem)
    				SEQUENCE(2 elem)
    					OBJECT IDENTIFIER 2.5.4.3
    					UTF8String CA
    		SEQUENCE(2 elem)
    			UTCTime 13-09-15 15:35:02 UTC
    			GeneralizedTime 2113-09-22 15:35:02 UTC
    		SEQUENCE(1 elem)
    			SET(1 elem)
    				SEQUENCE(2 elem)
    					OBJECT IDENTIFIER 2.5.4.3
    					UTF8String CA
    		SEQUENCE(2 elem)
    			SEQUENCE(2 elem)
    				OBJECT IDENTIFIER 1.2.840.113549.1.1.1
    				NULL
    			BIT STRING(1 elem)
    				SEQUENCE(2 elem)
    					INTEGER 00: 8D 80 B5 8E 80 8E 94 D1 04 03 6A 45 1A 54 5E 7E
    						        EE 6D 0C CB 0B 82 03 F1 7D C9 6F ED 52 02 B2 08
    						        C3 48 D1 24 70 C3 50 C2 1C 40 BC B5 9D F8 E8 A8
    						        41 16 7B 0B 34 1F 27 8D 32 2D 38 BA 18 A5 31 A9
    						        E3 15 20 3D E4 0A DC D8 CD 42 B0 E3 66 53 85 21
    						        7C 90 13 E9 F9 C9 26 5A F3 FF 8C A8 92 25 CD 23
    						        08 69 F4 A2 F8 7B BF CD 45 E8 19 33 F1 AA E0 2B
    						        92 31 22 34 60 27 2E D7 56 04 8B 1B 59 64 77 5F
    					INTEGER 65537
    		SEQUENCE(2 elem)
    			OBJECT IDENTIFIER 1.2.840.113549.1.1.5
    			NULL
    	BIT STRING 00: 0A 1C ED 77 F4 79 D5 EC 73 51 32 25 09 61 F7 00
    		           C4 64 74 29 86 5B 67 F2 3D A9 39 34 6B 3C A9 92
    		           B8 BF 07 13 0B A0 9B DF 41 E2 8A F6 D3 17 53 E1
    		           BA 7F C0 D0 BC 10 B7 9B 63 4F 06 D0 7B AC C6 FB
    		           CE 95 F7 8A 72 AA 10 EA B0 D1 6D 74 69 5E 20 68
    		           5D 1A 66 28 C5 59 33 43 DB EE DA 00 80 99 5E DD
    		           17 AC 43 36 1E D0 5B 06 0F 8C 6C 82 D3 BB 3E 2B
    		           A5 F1 94 FB 53 7B B0 54 22 6F F6 4C 18 1B 72 1C
    

    Это уже более похоже на то, что мы видим при открытии сертификатов в браузере или Windows. Пробежимся по каждому элементу:

    Важным моментом, о котором стоит особенно упомянуть являются данные, для которых вычисляется подпись. Интуитивно может показаться, что подписываются все данные идущие до последнего поля BIT STRING, содержащего подпись. Но на самом деле это не так. В стандарте x.

    	SEQUENCE(7 elem)
    		[0](1 elem)
    			INTEGER 2
    		INTEGER 1
    		SEQUENCE(2 elem)
    			OBJECT IDENTIFIER 1.2.840.113549.1.1.5
    			NULL
    		SEQUENCE(1 elem)
    			SET(1 elem)
    				SEQUENCE(2 elem)
    					OBJECT IDENTIFIER 2.5.4.3
    					UTF8String CA
    		SEQUENCE(2 elem)
    			UTCTime 13-09-15 15:35:02 UTC
    			GeneralizedTime 2113-09-22 15:35:02 UTC
    		SEQUENCE(1 elem)
    			SET(1 elem)
    				SEQUENCE(2 elem)
    					OBJECT IDENTIFIER 2.5.4.3
    					UTF8String CA
    		SEQUENCE(2 elem)
    			SEQUENCE(2 elem)
    				OBJECT IDENTIFIER 1.2.840.113549.1.1.1
    				NULL
    			BIT STRING(1 elem)
    				SEQUENCE(2 elem)
    					INTEGER 00: 8D 80 B5 8E 80 8E 94 D1 04 03 6A 45 1A 54 5E 7E
    						        EE 6D 0C CB 0B 82 03 F1 7D C9 6F ED 52 02 B2 08
    						        C3 48 D1 24 70 C3 50 C2 1C 40 BC B5 9D F8 E8 A8
    						        41 16 7B 0B 34 1F 27 8D 32 2D 38 BA 18 A5 31 A9
    						        E3 15 20 3D E4 0A DC D8 CD 42 B0 E3 66 53 85 21
    						        7C 90 13 E9 F9 C9 26 5A F3 FF 8C A8 92 25 CD 23
    						        08 69 F4 A2 F8 7B BF CD 45 E8 19 33 F1 AA E0 2B
    						        92 31 22 34 60 27 2E D7 56 04 8B 1B 59 64 77 5F
    					INTEGER 65537
    


    Т.о. если перед вами будет стоять задача проверить ЭЦП x.509 сертификата, то для этого сперва необходимо извлечь TBS-сертификат.

    Еще одно замечание относится к отпечатку сертификата. Как видите сам сертификат не содержит никаких сведений об отпечатке. Это объясняется тем, что отпечаток представляет собой обычное хеш-значение SHA-1 от всего файла сертификата, со всеми его полями, включая подпись издателя. Поэтому хранить отпечаток не обязательно, можно просто вычислять хеш при каждом просмотре сертификата.

    Оцените статью
    Мой сертификат
    Добавить комментарий