Openssl x509 export to file: примеры (PHP)

Экспорт сертификата X.509 в файл: использование openssl_x509_export_to_file
Раздел: Шифрование (OpenSSL)
openssl_x509_export_to_file(OpenSSLCertificate|string $certificate, string $output_filename, bool $no_text = true): bool
Назначение и параметры функции

Функция openssl_x509_export_to_file() используется для экспорта сертификата X.509 в файл. Это полезно для сохранения сертификатов, полученных из различных источников, в формате PEM для последующего использования или распространения.

Функция применяется в сценариях работы с шифрованием, SSL/TLS, цифровой подписью, когда требуется сохранить сертификат на диск.

Сигнатура функции:

bool openssl_x509_export_to_file(mixed $certificate, string $output_filename, bool $no_text = true)

Аргументы:

  • $certificate – Сертификат X.509. Может быть ресурсом, строкой с данными в формате PEM или DER, или массивом, возвращаемым функциями OpenSSL.
  • $output_filename – Путь к файлу, в который будет сохранен сертификат в формате PEM.
  • $no_text – Опциональный аргумент. Если установлен в false, в вывод добавляются человекочитаемые комментарии (например, информация о субъекте и издателе). По умолчанию true – выводятся только данные сертификата.

Возвращаемое значение: true в случае успеха, false при неудаче.

Простые примеры использования
Экспорт сертификата из строки
$certData = '-----BEGIN CERTIFICATE-----
MIID... (данные сертификата) ...
-----END CERTIFICATE-----';
$result = openssl_x509_export_to_file($certData, 'certificate.pem');
var_dump($result);
bool(true)
Экспорт с включением текстовых комментариев
$cert = openssl_csr_sign(
    openssl_csr_new(["commonName" => "example.com"], $privKey),
    null,
    $privKey,
    $days=365
);
$result = openssl_x509_export_to_file($cert, 'cert_with_text.pem', false);
// Файл 'cert_with_text.pem' содержит:
// Certificate:
//     Data:
//         Version: 3 (0x2)
//         Serial Number:
//             10:e6:fc:62:b7:41:8a:d5:00:5e:45:b6
//     ...
// -----BEGIN CERTIFICATE-----
// MIID...
// -----END CERTIFICATE-----
Экспорт из ресурса, полученного из файла
$certResource = openssl_x509_read(file_get_contents('source.crt'));
$result = openssl_x509_export_to_file($certResource, 'exported.crt');
bool(true)
Похожие функции в PHP
  • openssl_x509_export() – Экспортирует сертификат в строку вместо файла. Используется, когда результат нужен в переменной для дальнейшей обработки.
  • openssl_pkcs12_export_to_file() – Экспортирует сертификат и закрытый ключ в файл PKCS#12 (.pfx или .p12). Предпочтительнее для безопасного хранения пары ключ-сертификат.
  • file_put_contents() в комбинации с openssl_x509_export() – Альтернативный способ записи, предоставляющий больше контроля над процессом (например, обработка ошибок записи).

Выбор функции зависит от задачи: для быстрого сохранения в файл подходит openssl_x509_export_to_file(), для работы с данными в памяти – openssl_x509_export().

Типичные ошибки и их решение
Неверный путь к файлу
$result = openssl_x509_export_to_file($cert, '/nonexistent_folder/cert.pem');
var_dump($result); // false
while (($e = openssl_error_string()) !== false) {
    echo $e . "\n";
}
bool(false)
// Сообщения об ошибках OpenSSL могут отсутствовать.
// Ошибка связана с файловой системой.
Некорректный входной сертификат
$invalidCert = 'not a certificate';
$result = openssl_x509_export_to_file($invalidCert, 'bad.pem');
if ($result === false) {
    echo openssl_error_string();
}
error:0909006C:PEM routines:get_name:no start line
Недостаточные права на запись
$result = openssl_x509_export_to_file($cert, '/root/cert.pem'); // Запуск скрипта не от root
var_dump($result);
bool(false)
История изменений в версиях PHP

Функция была добавлена в PHP 5.2.2. Значительных изменений в ее сигнатуре не происходило. Поведение функции зависит от версии связанной библиотеки OpenSSL.

В PHP 8.0 функция строго типизирована: аргумент $no_text ожидает тип bool. Передача небулевых значений может приводить к предупреждениям.

Рекомендуется использовать актуальные версии PHP и OpenSSL для обеспечения поддержки современных алгоритмов и исправления уязвимостей.

Расширенные примеры применения
Пакетный экспорт нескольких сертификатов
Пример php
$certs = [
    'cert1' => $data1,
    'cert2' => $data2
];

foreach ($certs as $name => $data) {
    $filename = sprintf("certs/%s_%s.pem", $name, date('Ymd'));
    if (openssl_x509_export_to_file($data, $filename)) {
        echo "Сертификат {$name} экспортирован в {$filename}\n";
    }
}
Экспорт сертификата с цепочкой доверия
Пример php
// Предполагаем, что $fullChain - массив сертификатов, где первый - конечный, остальные - цепочка.
$fullChain = [$leafCert, $intermediateCert, $rootCert];
$outputContent = '';

foreach ($fullChain as $cert) {
    openssl_x509_export($cert, $pem);
    $outputContent .= $pem; // Конкатенация PEM-блоков
}

file_put_contents('fullchain.pem', $outputContent);
// В этом случае openssl_x509_export_to_file не подходит для всей цепочки, нужен обход.
Экспорт и установка прав на файл
Пример php
$tempFile = tempnam(sys_get_temp_dir(), 'cert');
if (openssl_x509_export_to_file($cert, $tempFile)) {
    chmod($tempFile, 0600); // Только для владельца на чтение/запись
    echo "Сертификат сохранен в {$tempFile} с правами 0600\n";
}
Обработка сертификата в формате DER
Пример php
$derData = file_get_contents('certificate.der');
// Конвертация DER в PEM перед экспортом
$pemData = "-----BEGIN CERTIFICATE-----\n" .
           chunk_split(base64_encode($derData)) .
           "-----END CERTIFICATE-----";
$result = openssl_x509_export_to_file($pemData, 'from_der.pem');
Экспорт с дополнительной проверкой валидности
Пример php
function exportValidCert($cert, $filename) {
    if (openssl_x509_checkpurpose($cert, X509_PURPOSE_SSL_SERVER)) {
        return openssl_x509_export_to_file($cert, $filename);
    }
    return false;
}

$result = exportValidCert($cert, 'valid_server_cert.pem');
Аналоги в других языках программирования
Python (cryptography)
from cryptography import x509
from cryptography.hazmat.primitives import serialization

with open("source.crt", "rb") as f:
    pem_data = f.read()

cert = x509.load_pem_x509_certificate(pem_data)

with open("exported.pem", "wb") as f:
    f.write(cert.public_bytes(serialization.Encoding.PEM))
Node.js (crypto module)
const fs = require('fs');
const crypto = require('crypto');

const pem = fs.readFileSync('source.crt', 'utf8');
const cert = new crypto.X509Certificate(pem);

fs.writeFileSync('exported.pem', cert.toString());

Openssl x509 export to file в MySQL

В MySQL нет прямой аналогии, но можно хранить сертификаты в таблицах с типом данных TEXT и использовать функции LOAD_FILE() для импорта из файла.

CREATE TABLE certs (id INT, cert_data TEXT);
INSERT INTO certs VALUES (1, LOAD_FILE('/tmp/certificate.pem'));

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

PHP openssl_x509_export_to_file function comments

En
Openssl x509 export to file Exports a certificate to a file