Openssl csr export: примеры (PHP)

Полное руководство по openssl_csr_export с практическими примерами
Раздел: Шифрование (OpenSSL)
openssl_csr_export(OpenSSLCertificateSigningRequest|string $csr, string &$output, bool $no_text = true): bool
Описание функции openssl_csr_export

Функция openssl_csr_export экспортирует запрос на подпись сертификата (Certificate Signing Request, CSR) в строковый формат PEM или другого типа. Эта функция применима в процессах генерации и проверки сертификатов для веб-серверов, клиентской аутентификации или создания цепочек доверия.

Аргументы функции
  • $csr (resource|OpenSSLCertificateSigningRequest) – ресурс CSR, полученный из openssl_csr_new() или другой функции.
  • &$output (string) – переменная, передаваемая по ссылке, в которую будет записан CSR в текстовом формате.
  • $no_text (bool) – опциональный параметр. При значении true из вывода удаляются дополнительные текстовые данные, оставляя только PEM-кодировку. По умолчанию false.

Функция возвращает true при успешном выполнении и false в случае ошибки.

Базовые примеры использования
Пример 1: Простой экспорт CSR
// Создание приватного ключа
$privateKey = openssl_pkey_new([
    "private_key_bits" => 2048,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
]);

// Создание данных для CSR
$dn = [
    "countryName" => "RU",
    "commonName" => "example.com",
];

$csr = openssl_csr_new($dn, $privateKey);
$csrOutput = '';

if (openssl_csr_export($csr, $csrOutput)) {
    echo "CSR успешно экспортирован";
} else {
    echo "Ошибка экспорта";
}
CSR успешно экспортирован
Пример 2: Экспорт CSR без текстовых данных
$csrOutputClean = '';
if (openssl_csr_export($csr, $csrOutputClean, true)) {
    echo strlen($csrOutputClean) . " байт\n";
    echo substr($csrOutputClean, 0, 50) . "...";
}
1248 байт
-----BEGIN CERTIFICATE REQUEST-----
MIIC0TCCAbkCAQAwgYUxCzAJBgNVBAYTAlJV...
Похожие функции в PHP

Записывает CSR непосредственно в файл, а не в переменную. Удобно для сохранения на диск.

openssl_csr_export_to_file($csr, 'request.csr');

Извлекает информацию о субъекте из CSR в виде массива, не экспортируя весь запрос.

$subject = openssl_csr_get_subject($csr);
print_r($subject);
Array
(
    [C] => RU
    [CN] => example.com
)

Получает открытый ключ из CSR. Применяется для проверки соответствия приватному ключу.

Типичные ошибки
Ошибка 1: Некорректный ресурс CSR
$invalidCsr = false;
$output = '';
if (!openssl_csr_export($invalidCsr, $output)) {
    echo "Не удалось экспортировать CSR";
    $error = openssl_error_string();
    echo $error;
}
Не удалось экспортировать CSR
error:0E06D06C:configuration file routines:NCONF_get_string:no value
Ошибка 2: Передача не по ссылке
$output = '';
// Неправильно:
// openssl_csr_export($csr, $output, false);
// Правильно: переменная автоматически передается по ссылке
Ошибка 3: Неинициализированный приватный ключ

Если приватный ключ не был создан или поврежден, генерация CSR завершится ошибкой, что повлияет на экспорт.

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

Параметр $csr теперь может принимать объект OpenSSLCertificateSigningRequest вместо ресурса (resource).

PHP 8.1 и новее

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

Для обратной совместимости можно использовать проверку типа:

if ($csr instanceof OpenSSLCertificateSigningRequest || is_resource($csr)) {
    openssl_csr_export($csr, $output);
}
Расширенные примеры
Пример 1: Экспорт CSR в формате DER
Пример php
// Экспорт в PEM
$pemOutput = '';
openssl_csr_export($csr, $pemOutput);

// Конвертация PEM в DER
$pemData = str_replace(['-----BEGIN CERTIFICATE REQUEST-----',
                        '-----END CERTIFICATE REQUEST-----',
                        "\n", "\r"], '', $pemOutput);
$derOutput = base64_decode($pemData);

echo "DER размер: " . strlen($derOutput) . " байт";
DER размер: 834 байт
Пример 2: Получение CSR из файла и экспорт с дополнительными параметрами
Пример php
// Чтение CSR из файла
$csrContent = file_get_contents('existing.csr');
$csrResource = openssl_csr_get_public_key($csrContent);

if ($csrResource) {
    $exported = '';
    openssl_csr_export($csrResource, $exported, false);
    // Анализ субъекта
    $details = openssl_csr_get_subject($csrResource, false);
    echo "Субъект: " . $details['CN'];
}
Пример 3: Массовый экспорт нескольких CSR
Пример php
$csrArray = []; // массив CSR ресурсов
$exportedArray = [];

foreach ($csrArray as $index => $csrItem) {
    if (openssl_csr_export($csrItem, $exportedArray[$index], true)) {
        echo "CSR $index экспортирован\n";
    }
}
Пример 4: Валидация CSR перед экспортом
Пример php
function validateAndExportCsr($csr, &$output) {
    // Проверка подписи CSR
    if (openssl_csr_verify($csr)) {
        // Получение открытого ключа
        $publicKey = openssl_csr_get_public_key($csr);
        $details = openssl_pkey_get_details($publicKey);
        
        if ($details['bits'] >= 2048) {
            return openssl_csr_export($csr, $output);
        }
    }
    return false;
}
Аналоги в других языках программирования
Python (cryptography)
from cryptography import x509
from cryptography.hazmat.primitives import serialization

# Загрузка CSR из файла
with open("request.csr", "rb") as f:
    csr = x509.load_pem_x509_csr(f.read())

# Экспорт в PEM
pem_csr = csr.public_bytes(serialization.Encoding.PEM)
print(pem_csr.decode())
JavaScript (Node.js с модулем 'openssl-wrapper')
const openssl = require('openssl-wrapper');

openssl.exec('req -in request.csr -text -noout', function(err, buffer) {
    console.log(buffer.toString());
});
Bash/OpenSSL CLI
# Просмотр содержимого CSR
openssl req -in request.csr -text -noout

# Экспорт в формате PEM (уже по умолчанию)
openssl req -in request.csr -out request.pem

PHP openssl_csr_export function comments

En
Openssl csr export Exports a CSR to a string