Детект DER/CER/PEM сертификата

92
09 июня 2021, 07:50

Есть некоторый сервер, который перекидывает сертификат от одной системы к другой и появилась необходимость уменьшить объём передаваемых данных, отсюда пришла идея, что сертификат, который предоставлен уже в виде буквенно-цифровых символов, которые нормально передаются через json не кодировать в base64 и оставить подобное кодирование только для сертификатов в двоичной форме.

Проблема в том, что не понимаю, как можно узнать находится ли сертификат в PEM/DER кодировке (и соответственно, не нужно дополнительно кодировать в base64) или является CER сертификатов (и соответственно, нужно кодировать в base64 для передачи)

Оказалось, что используя штатный X509Certificate2 можно только различить ситуацию валидный сертификат и невалидный сертификат:

        try
        {
            var x509Certificate2 = new X509Certificate2();
            x509Certificate2.Import(data);

А вытащить информацию о том, что за тип у сертификата нельзя.

Как-то всё-таки это сделать правильно? Городить какие-то костыли проверяя регулярками что строка содержит только буквенно-цифровые символы кажется неправильной.

Answer 1

Я бы открыл файл и зачитал несколько первых байтов.

Если файл начинается с -----BEGIN, то это PEM формат.

Если файл начинается с MII, то это base64-encoded DER

Если файл начинается с байтов 0x30 0x82, то это бинарная DER кодировка ASN.1 объекта типа SEQUENCE, а все сертификаты, по стандарту, именно SEQUENCE. 0x82 означает, что размер структуры данных выражается двухбайтовым целым. Если стоит 0x83, то размер превышает 64 кб, что в принципе возможно для какого-нибудь CRL, но маловероятно для отдельного сертификата.

Может быть теоретически случай, когда второй байт 0x81. Это означает, что длина умещается в 1 байт, то есть размер объекта меньше 256 байтов. Я подозреваю, что это возможно, если взять ключи и подписи минимальных размеров и с минимумом символов в CN, но по нынешним временам такой сертификат надо заворачивать с порога)

В противном случае я не знаю, что это может быть.

READ ALSO
движение персонажа вместе с движущейся платформой unity3d

движение персонажа вместе с движущейся платформой unity3d

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

101
Если источник null то мапить byte array тоже в null

Если источник null то мапить byte array тоже в null

Есть проблема с маппингом поля типа byte[8]Если значение поля источника равно null, то автомаппинг присваивает полю приемника значение 0x00000000

122
Эталонная реализация MVP в WinForms

Эталонная реализация MVP в WinForms

Хочу понять MVP паттерн на практике, но, кажется, не все понимаю правильно, поэтому простой вопрос: на форме есть кнопка и лейбл, так же есть...

106
Передача типов с интерфейсом в параметры метода расширения C#

Передача типов с интерфейсом в параметры метода расширения C#

Долго бился над этим вопросом, штудируя литературу и неистово насилуя гугл, но так и не нашел решения, может кто здесь подскажет

98