Openssl x509 export: примеры (PHP)
Работа с X.509 сертификатами в PHP через openssl_x509_export
Раздел: Шифрование (OpenSSL)
openssl_x509_export(OpenSSLCertificate|string $certificate, string &$output, bool $no_text = true): boolтиповые примерыopenssl x509 export на js, python, mysqlopenssl x509 export изменения phpпримеры расширенные
Описание функции openssl_x509_export
Функция openssl_x509_export() экспортирует сертификат X.509 в строковый формат PEM. Часто используется для преобразования сертификата из бинарного представления в текстовое, для сохранения в файл, передачи по сети или отображения.
Синтаксис
bool openssl_x509_export(mixed $certificate, string &$output, bool $notext = true)
Аргументы
- $certificate - Сертификат X.509. Может быть ресурсом, объектом OpenSSLCertificate (PHP 8.0+) или строкой с путем к файлу в формате PEM или DER.
- $output - Переменная, передаваемая по ссылке, в которую будет записан сертификат в формате PEM.
- $notext - Необязательный параметр. При значении
true(по умолчанию) сокращает вывод, убирая текстовые комментарии о сертификате. Приfalseдобавляет человекочитаемые данные.
Короткие примеры использования
Экспорт сертификата из файла
<?php
$certFile = 'certificate.crt';
$cert = openssl_x509_read(file_get_contents($certFile));
$result = openssl_x509_export($cert, $output);
echo $result ? 'Успешно' : 'Ошибка';
?>Успешно
Экспорт с текстовыми комментариями
<?php
$certData = '-----BEGIN CERTIFICATE-----...';
$cert = openssl_x509_read($certData);
openssl_x509_export($cert, $output, false);
echo substr($output, 0, 200) . '...';
?>-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAK...
-----END CERTIFICATE-----
Certificate:
Data:
Version: 3 (0x2)
Serial Number:...Экспорт из строки в формате DER
<?php
$derData = file_get_contents('certificate.der');
$cert = openssl_x509_read($derData);
if(openssl_x509_export($cert, $output)) {
echo strlen($output) . ' байт';
}
?>1247 байт
Похожие функции в PHP
- openssl_x509_read() - Парсит сертификат и возвращает ресурс/объект для последующих операций. Используется перед
openssl_x509_export. - openssl_x509_parse() - Возвращает массив с детальной информацией о сертификате (субъект, издатель, срок действия). Не экспортирует в PEM.
- openssl_x509_export_to_file() - Прямая запись сертификата в файл. Более эффективна для сохранения на диск.
- openssl_pkcs12_export() - Экспортирует сертификат и приватный ключ в формат PKCS#12. Используется для переноса пары ключ-сертификат.
Типичные ошибки
Неверный тип входных данных
<?php
$output = '';
$result = openssl_x509_export('invalid_string', $output);
var_dump($result, openssl_error_string());
?>bool(false) string(56) "error:0909006C:PEM routines:get_name:no start line"
Переменная для вывода не передана по ссылке
<?php
$cert = openssl_x509_read('-----BEGIN CERT...');
$output = '';
// НЕВЕРНО: передача значения, а не ссылки
$result = openssl_x509_export($cert, $output);
// Верно: openssl_x509_export($cert, $output);
echo $output;
?>(пустой вывод)
Использование несуществующего файла
<?php
$cert = openssl_x509_read(file_get_contents('missing.crt'));
if($cert === false) {
echo 'Ошибка чтения: ' . openssl_error_string();
}
?>Ошибка чтения: error:02001002:system library:fopen:No such file or directory
Изменения в PHP 8.x
- В PHP 8.0.0 тип параметра
$certificateрасширен: теперь кроме ресурса принимает объектOpenSSLCertificate. - С PHP 8.0.0 функция выбрасывает исключение
OpenSSLCertificateExceptionпри ошибках вместо молчаливого возвратаfalse(хотя старый стиль с проверкой возвращаемого значения сохраняется). - В PHP 8.2.0 добавлено предупреждение о устаревании передачи не корректного типа в
$certificate.
Расширенные примеры
Экспорт цепочки сертификатов
Пример php
<?php
$pemChain = file_get_contents('chain.pem');
// Разделение цепочки на отдельные сертификаты
$certs = preg_split('/(?=-----BEGIN CERTIFICATE-----)/', $pemChain);
foreach($certs as $index => $certData) {
if(trim($certData)) {
$cert = openssl_x509_read($certData);
openssl_x509_export($cert, $exported);
file_put_contents("cert_$index.pem", $exported);
}
}
?>Проверка и экспорт сертификата из приватного ключа
Пример php
<?php
$privKey = openssl_pkey_get_private('file://private.key');
$csr = openssl_csr_new(['CN' => 'example.com'], $privKey);
$cert = openssl_csr_sign($csr, null, $privKey, 365);
openssl_x509_export($cert, $x509);
// Проверка подписи
$verify = openssl_x509_verify($cert, $privKey);
echo 'Verify result: ' . $verify;
?>Конвертация между форматами
Пример php
<?php
// DER to PEM
$der = file_get_contents('cert.der');
$cert = openssl_x509_read($der);
openssl_x509_export($cert, $pem);
// PEM to DER (используя openssl_x509_export)
$cert = openssl_x509_read($pem);
$der = openssl_x509_fingerprint($cert, 'sha256', true); // Пример другого преобразования
// Альтернатива для PEM в DER:
$der = openssl_x509_read($pem);
openssl_x509_export($cert, $pemTemp, true);
$der = base64_decode(preg_replace('/-+[^-]+-+/', '', $pemTemp));
?>Экспорт с сохранением в базу данных
Пример php
<?php
$cert = openssl_x509_read($certData);
openssl_x509_export($cert, $exported);
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->prepare('INSERT INTO certificates (pem_data) VALUES (?)');
$stmt->execute([$exported]);
// Получение обратно
$stmt = $pdo->query('SELECT pem_data FROM certificates LIMIT 1');
$row = $stmt->fetch();
$cert2 = openssl_x509_read($row['pem_data']);
$info = openssl_x509_parse($cert2);
echo $info['subject']['CN'];
?>Альтернативы в других языках
Python (cryptography)
from cryptography import x509
from cryptography.hazmat.primitives import serialization
with open("certificate.pem", "rb") as f:
cert = x509.load_pem_x509_certificate(f.read())
pem = cert.public_bytes(serialization.Encoding.PEM)
print(pem.decode())Node.js (crypto)
const fs = require('fs');
const crypto = require('crypto');
const certPem = fs.readFileSync('certificate.crt');
const cert = new crypto.X509Certificate(certPem);
console.log(cert.toString()); // Аналог PEM экспортаOpenSSL (CLI)
openssl x509 -in certificate.der -inform DER -out certificate.pem -outform PEMPHP openssl_x509_export function comments
En
Openssl x509 export Exports a certificate to a string