Openssl x509 parse: примеры (PHP)

Работа с сертификатами X.509: функция openssl_x509_parse
Раздел: Шифрование (OpenSSL)
openssl_x509_parse(OpenSSLCertificate|string $certificate, bool $short_names = true): array|false
Функция openssl_x509_parse

Функция openssl_x509_parse предназначена для анализа и разбора сертификата X.509. Она используется, когда требуется получить структурированную информацию о сертификате: данные о субъекте, издателе, сроках действия, публичном ключе и расширениях.

Аргументы функции
  • certificate (обязательный) – принимает сертификат в формате, поддерживаемом OpenSSL. Это может быть строковый ресурс, содержащий PEM или DER данные, или путь к файлу с сертификатом.
  • short_names (опциональный, по умолчанию true) – булево значение. Если установлено в true, поля в результирующем массиве будут иметь короткие имена. При false используются длинные описательные имена.

Функция возвращает ассоциативный массив с данными сертификата или false в случае неудачи.

Примеры использования
Пример 1: Базовый разбор PEM-сертификата
<?
$cert = '-----BEGIN CERTIFICATE-----
MIIF... (содержимое сертификата)
-----END CERTIFICATE-----';
$parsed = openssl_x509_parse($cert);
print_r($parsed);
?>
Array
(
    [name] => /C=US/ST=...
    [subject] => Array
        (
            [C] => US
            [ST] => ...
        )
    [hash] => a1b2c3d4
    ...
)
Пример 2: Использование с short_names = false
<?
$parsed = openssl_x509_parse($cert, false);
print_r($parsed['subject']);
?>
Array
(
    [countryName] => US
    [stateOrProvinceName] => ...
)
Пример 3: Чтение сертификата из файла
<?
$parsed = openssl_x509_parse(file_get_contents('cert.pem'));
echo $parsed['validFrom_time_t'];
?>
1698765432
Похожие функции в PHP

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

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

openssl_x509_verify

Проверяет цифровую подпись сертификата с помощью публичного ключа. Применяется для проверки подлинности.

Функцию openssl_x509_parse выбирают для извлечения и анализа метаданных сертификата, тогда как другие функции ориентированы на конкретные операции.

Типичные ошибки
Передача некорректного формата сертификата
<?
$result = openssl_x509_parse('not a certificate');
var_dump($result);
?>
bool(false)

Функция возвращает false, если данные не являются валидным сертификатом.

Неверный путь к файлу
<?
$parsed = openssl_x509_parse('nonexistent.pem');
if ($parsed === false) {
    echo 'Ошибка разбора';
}
?>
Ошибка разбора

При передаче пути функция ожидает содержимое файла, а не путь. Нужно сначала прочитать файл.

Изменения в версиях PHP

В PHP 8.0 функция стала возвращать дополнительное поле purposes, содержащее информацию о возможных назначениях сертификата из расширения keyUsage. Также улучшена обработка ошибок.

В PHP 8.1 добавлена более строгая типизация аргументов.

Расширенные примеры
Извлечение SAN (Subject Alternative Names)
Пример php
<?
$parsed = openssl_x509_parse($cert);
if (isset($parsed['extensions']['subjectAltName'])) {
    echo $parsed['extensions']['subjectAltName'];
}
?>
DNS:example.com, DNS:www.example.com
Анализ цепочки сертификатов
Пример php
<?
$certs = [$cert1, $cert2]; // массив PEM-сертификатов
foreach ($certs as $pem) {
    $parsed = openssl_x509_parse($pem);
    echo $parsed['subject']['CN'] . ' - ' . $parsed['issuer']['CN'] . "\n";
}
?>
example.com - GlobalSign Root CA
GlobalSign Root CA - GlobalSign Root CA
Проверка срока действия
Пример php
<?
$parsed = openssl_x509_parse($cert);
$now = time();
if ($now > $parsed['validTo_time_t']) {
    echo 'Сертификат просрочен';
}
?>
Сертификат просрочен
Альтернативы в других языках
Python (cryptography)
from cryptography import x509
from cryptography.hazmat.backends import default_backend
pem_data = open('cert.pem', 'rb').read()
cert = x509.load_pem_x509_certificate(pem_data, default_backend())
print(cert.subject)
<Name(C=US,ST=...)>

Библиотека предоставляет объектно-ориентированный интерфейс.

JavaScript (Node.js с модулем crypto)
const crypto = require('crypto');
const pem = fs.readFileSync('cert.pem');
const cert = new crypto.X509Certificate(pem);
console.log(cert.subject);
/C=US/ST=...

Встроенный модуль, доступен с Node.js 15.6.0.

Openssl x509 parse в MySQL

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

PHP openssl_x509_parse function comments

En
Openssl x509 parse Parse an X509 certificate and return the information as an array