Nano Hash - криптовалюты, майнинг, программирование

Извлечь данные из сертификата с помощью perl Crypt::X509

Я пытаюсь извлечь данные из сертификата .pem с помощью библиотеки Crypt::X509, но получаю ошибку при построении объекта. Вот что я делаю: 1. Читаю содержимое файла .pem:

my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
   $atime,$mtime,$ctime,$blksize,$blocks) = stat $s_filename;
open FILE, "<$s_filename" or die "no such file";
binmode FILE;
my $pem_cert;
read FILE, $pem_cert, $size;
close FILE; 

2. Декодируйте содержимое из base64, чтобы получить содержимое в формате DER. Это сделано потому, что в документации CPAN библиотеки Crypt::X509 указано, что ее нужно передать:

Переменная, содержащая сертификат в формате DER для анализа.

my $der = MIME::Base64::decode($pem_cert);
  1. Вызовите конструктор Crypt::X509 и проверьте наличие ошибок:

my $oref_x509= Crypt::X509->new(cert=>$der); if ( $oref_x509->error ) { warn "Error on parsing certificate: ", $oref_x509->error; }

Я получаю следующую ошибку:

Error on parsing certificate: decode error 04<=>30 0 8  at ..<path>../Convert/ASN1/_decode.pm line 113.  

Я пробовал с другим сертификатом, но ошибка та же.

17.08.2016

Ответы:


1

При преобразовании сертификата из PEM в DER с использованием MIME::Base64::decode необходимо удалить заголовок и трейлер PEM, т.е. вместо декодирования

-----BEGIN CERTIFICATE-----
MIICVTCCAbegAwIBAgIELwBe7DAKBggqhkjOPQQDAjAaMRgwFgYDVQQDDA9mb28u
....
-----END CERTIFICATE-----

вы должны декодировать только часть base64:

MIICVTCCAbegAwIBAgIELwBe7DAKBggqhkjOPQQDAjAaMRgwFgYDVQQDDA9mb28u
....

Поскольку -----BEGIN CERTIFICATE----- и т. д. содержат допустимые символы base64, они будут использоваться для декодирования, а недопустимые символы игнорируются.

17.08.2016

2

Вам не нужно открывать файл с кодировкой base64 в двоичном режиме, так как он уже является 8-битным. Однако файл DER является двоичным, поэтому использование binmode() в этом случае является правильным.

Я думаю, проблема в том, что сертификат, который вы пытаетесь проанализировать, на самом деле имеет формат PEM, а не формат DER. Если вы посмотрите на ответ Стефана, он подробно описывает разницу (в основном то, что DER представляет собой декодированный base64 вариант PEM, после удаление верхнего/нижнего колонтитула PEM).

Если у вас есть доступ к openssl, вы можете преобразовать его из PEM в DER с помощью команды:

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

(где cert.pem — имя вашего входного сертификата).

После этого вы сможете использовать это с Crypt::X509.

Если я попытаюсь проанализировать файл формата PEM или base64 декодировать и проанализировать его, я получаю ту же ошибку:

Failed to parse cert: decode error 04<=>30 0 8  at /usr/local/share/perl5/Convert/ASN1/_decode.pm line 113.

Однако, если я использую версию DER, она работает правильно:

use warnings 'all';
use strict;

use Crypt::X509;

my $file = 'cert.der';
my $size = (stat $file)[7];

my $cert;
open(my $fh, '<', $file) or die "failed to open cert: $!";
binmode($fh);
read $fh, $cert, $size;
close($fh);

my $x509 = Crypt::X509->new(cert => $cert);
if($x509->error) {
    die "Failed to parse cert: " . $x509->error;
}
17.08.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..