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

Работа с CSR в PHP: функция экспорта в файл
Раздел: Шифрование (OpenSSL)
openssl_csr_export_to_file(OpenSSLCertificateSigningRequest|string $csr, string $output_filename, bool $no_text = true): bool
Функция openssl_csr_export_to_file

Функция openssl_csr_export_to_file экспортирует запрос на подпись сертификата (Certificate Signing Request, CSR) в файл. Использование функции связано с операциями криптографии при работе с SSL/TLS. Она применяется для сохранения CSR, который был создан с помощью функций генерации ключей.

Аргументы функции
  • csr - ресурс запроса на подпись сертификата, полученный от openssl_csr_new или другого источника.
  • output_filename - путь к файлу, в который будет записан CSR в формате PEM.
  • notext - необязательный параметр, принимающий значение true или false. При значении true в файл не включается дополнительная текстовая информация. По умолчанию false.
Примеры использования
Базовый пример
// Создание нового закрытого ключа и CSR
$private_key = openssl_pkey_new([
    'digest_alg' => 'sha256',
    'private_key_bits' => 2048,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
]);

$dn = [
    'countryName' => 'RU',
    'commonName' => 'example.com',
];

$csr = openssl_csr_new($dn, $private_key);
$result = openssl_csr_export_to_file($csr, 'csr.pem');
var_dump($result);
bool(true)
Экспорт без дополнительного текста
// Экспорт CSR без текстовых комментариев
$result = openssl_csr_export_to_file($csr, 'csr_no_text.pem', true);
var_dump($result);
bool(true)
Похожие PHP функции
  • openssl_csr_export - экспортирует CSR в строку, а не в файл. Применяется когда нужно сохранить CSR в переменную для дальнейшей обработки.
  • openssl_csr_get_subject - возвращает данные о субъекте CSR в виде массива. Используется для извлечения информации из CSR без экспорта.
  • openssl_csr_get_public_key - извлекает открытый ключ из CSR. Полезна для проверки соответствия ключа.

Выбор функции зависит от цели: сохранение в файл, передача через сеть или обработка данных CSR.

Типичные ошибки
Неверный тип аргумента csr
$csr = 'not_a_resource';
$result = openssl_csr_export_to_file($csr, 'csr.pem');
if ($result === false) {
    echo 'Ошибка: неверный тип CSR';
}
Ошибка: неверный тип CSR
Проблемы с правами доступа к файлу
// Попытка записи в системную директорию без прав
$result = openssl_csr_export_to_file($csr, '/root/csr.pem');
if ($result === false) {
    echo 'Ошибка записи файла';
}
Ошибка записи файла
Отсутствующий CSR
$csr = null;
$result = openssl_csr_export_to_file($csr, 'csr.pem');
if ($result === false) {
    echo 'CSR не существует';
}
CSR не существует
Изменения в PHP

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

В PHP 8.1 не было значительных изменений для этой функции, но улучшена общая стабильность модуля OpenSSL.

Расширенные примеры
Генерация CSR с несколькими доменами
Пример php
$private_key = openssl_pkey_new([
    'private_key_bits' => 4096,
    'private_key_type' => OPENSSL_KEYTYPE_EC,
    'curve_name' => 'prime256v1'
]);

$dn = [
    'countryName' => 'RU',
    'stateOrProvinceName' => 'Moscow',
    'localityName' => 'Moscow',
    'organizationName' => 'Company Name',
    'commonName' => 'maindomain.com',
];

$csr = openssl_csr_new($dn, $private_key, [
    'digest_alg' => 'sha384',
    'req_extensions' => 'req_ext',
    'config' => '/etc/ssl/openssl.cnf'
]);

// Добавление альтернативных имен в конфигурации
$config = array_merge(openssl_csr_get_subject($csr), [
    'x509_extensions' => 'v3_req'
]);

openssl_csr_export_to_file($csr, 'multidomain.csr');
echo 'CSR для нескольких доменов создан';

// Проверка содержимого файла
echo file_get_contents('multidomain.csr');
-----BEGIN CERTIFICATE REQUEST-----
MIIC...
-----END CERTIFICATE REQUEST-----
Пакетный экспорт нескольких CSR
Пример php
$domains = ['domain1.ru', 'domain2.ru', 'domain3.ru'];
$results = [];

foreach ($domains as $domain) {
    $key = openssl_pkey_new(['private_key_bits' => 2048]);
    $csr = openssl_csr_new(['commonName' => $domain], $key);
    $filename = 'csr_' . $domain . '.pem';
    $results[$domain] = openssl_csr_export_to_file($csr, $filename, true);
}

print_r($results);
Array
(
    [domain1.ru] => 1
    [domain2.ru] => 1
    [domain3.ru] => 1
)
Аналоги в других языках

Openssl csr export to file в Python

from cryptography import x509
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives.hashes import SHA256

private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048
)
csr = x509.CertificateSigningRequestBuilder().sign(private_key, SHA256())
with open('csr.pem', 'wb') as f:
    f.write(csr.public_bytes(serialization.Encoding.PEM))
JavaScript (Node.js с модулем openssl-wrapper)
const openssl = require('openssl-wrapper');
const fs = require('fs');

// Пример через командную строку
openssl.exec('req', {new: true, key: 'key.pem', out: 'csr.pem'}, (err, buffer) => {
    console.log('CSR экспортирован в файл');
});

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

PHP openssl_csr_export_to_file function comments

En
Openssl csr export to file Exports a CSR to a file