как извлечь закодированный DER-сертификат из строки base64

Поиск справки о том, как декодировать следующую строку base64 MerkleTreeLeaf.

Структура MerkleTreeLeaf представляет собой составную структуру данных, которая содержит временную метку, а также цифровой сертификат.

Структура кодируется как байтовая строка с кодировкой Base64. Внутри этой байтовой строки есть фактический сертификат, закодированный в формате DER.

Я ищу php-решение для извлечения закодированного DER-сертификата.

Вот пример строки с кодировкой base64

AAAAAAFNDPxFcQAAAAUaMIIFFjCCBLygAwIBAgIQM+cDs5qlvsI+p+vbo9bw2sZxaxwF15mHiSlEiaGVuwv2DxOPO+w/QVgMTggZ+RvfuON3zQ7IDdwQAAABSitKXtQAAAQDAEYwRAIgIQ2Dr+ktUJh1OFYAJxUqHwMjLmsMdvGToFaxSqEcAg8CIDjgHlQ8mV/NXsUC115hF5S7MZirjD7mdH52s6yv5JQiAHUAOTdvVF97Rgf1l0LXaM1dJDe/NHO2U0pINLz3Lmgcg8kAAAFKK0phCQAABAMARjBEAiA1GlOmlOeAP+uOmq+uPMVeN0TDsRZBxUE7oWUtZlKBOAIgFOoXuDXnAFALmW7CN66yrnHO7UyuMYy5t4oJqvgmzzowCgYIKoZIzj0EAwIDSAAwRQIgNqNb4f3YfKCvnkYjihpB9jGq0iUnfPclyD7mWxDJYt8CIQCJbJ48ZxGx2WYGRMXys52lxc/VxzzvdlSRto9y/jLhzAAA 

Если я использую онлайн- конвертер base64, он показывает некоторые детали, но, очевидно, его нечитаемость. Если я смогу извлечь закодированный DER-сертификат, я могу использовать openssl для его анализа.

Solutions Collecting From Web of "как извлечь закодированный DER-сертификат из строки base64"

Вы можете приблизиться к нему так же, как и скрипт Python в своем комментарии, просто сравнивая документацию распаковки Python с тем, что для PHP . Если вам нужен только непроверенный сертификат, вы можете уйти с

 <?php function mtl_to_x509($base64str) { $raw = base64_decode($base64str); // Parse the decoded string $cert_length = unpack('N', chr(0).substr($raw, 12, 3))[1]; $cert_as_asn1 = substr($raw, 15, $cert_length); return $cert_as_asn1; } $example = "AAAAAAFNDPxFcQAAAAUaMIIFFjCCBLygAwIBAgIQM+cDs5qlvsI+p+vbo9bw2sZxaxwF15mHiSlEiaGVuwv2DxOPO+w/QVgMTggZ+RvfuON3zQ7IDdwQAAABSitKXtQAAAQDAEYwRAIgIQ2Dr+ktUJh1OFYAJxUqHwMjLmsMdvGToFaxSqEcAg8CIDjgHlQ8mV/NXsUC115hF5S7MZirjD7mdH52s6yv5JQiAHUAOTdvVF97Rgf1l0LXaM1dJDe/NHO2U0pINLz3Lmgcg8kAAAFKK0phCQAABAMARjBEAiA1GlOmlOeAP+uOmq+uPMVeN0TDsRZBxUE7oWUtZlKBOAIgFOoXuDXnAFALmW7CN66yrnHO7UyuMYy5t4oJqvgmzzowCgYIKoZIzj0EAwIDSAAwRQIgNqNb4f3YfKCvnkYjihpB9jGq0iUnfPclyD7mWxDJYt8CIQCJbJ48ZxGx2WYGRMXys52lxc/VxzzvdlSRto9y/jLhzAAA"; print mtl_to_x509($example); ?> 

Чтобы убедиться, что это делает работу, обратите внимание, что мы действительно можем разобрать ее с помощью openssl:

 $ php mtl_to_x509.php | openssl x509 -inform der -noout -text | grep Subject: Subject: 1.3.6.1.4.1.311.60.2.1.3=US/1.3.6.1.4.1.311.60.2.1.2=Delaware/1.3.6.1.4.1.311.60.2.1.1=Wilmington, C=US, ST=California, L=Mountain View/businessCategory=Private Organization/serialNumber=2158113, O=Symantec Corp, OU=for ct testing-- ecc, CN=evpro1.ev1.symantec.com 

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

 $version = unpack('C', substr($raw, 0, 1))[1]; $ctype = unpack('C', substr($raw, 1, 1))[1]; $timestamp = unpack('J', substr($raw, 2, 8))[1]; $entry_type = unpack('n', substr($raw, 10, 2))[1];