Openssl csr export: примеры (PHP)
openssl_csr_export(OpenSSLCertificateSigningRequest|string $csr, string &$output, bool $no_text = true): boolФункция 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 в случае ошибки.
// Создание приватного ключа
$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 успешно экспортирован
$csrOutputClean = '';
if (openssl_csr_export($csr, $csrOutputClean, true)) {
echo strlen($csrOutputClean) . " байт\n";
echo substr($csrOutputClean, 0, 50) . "...";
}
1248 байт -----BEGIN CERTIFICATE REQUEST----- MIIC0TCCAbkCAQAwgYUxCzAJBgNVBAYTAlJV...
Записывает 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. Применяется для проверки соответствия приватному ключу.
$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
$output = '';
// Неправильно:
// openssl_csr_export($csr, $output, false);
// Правильно: переменная автоматически передается по ссылке
Если приватный ключ не был создан или поврежден, генерация CSR завершится ошибкой, что повлияет на экспорт.
Параметр $csr теперь может принимать объект OpenSSLCertificateSigningRequest вместо ресурса (resource).
Усилена типизация. Функция теперь более строго проверяет типы входных параметров. Также улучшены сообщения об ошибках.
Для обратной совместимости можно использовать проверку типа:
if ($csr instanceof OpenSSLCertificateSigningRequest || is_resource($csr)) {
openssl_csr_export($csr, $output);
}// Экспорт в 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 байт
// Чтение 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'];
}
$csrArray = []; // массив CSR ресурсов
$exportedArray = [];
foreach ($csrArray as $index => $csrItem) {
if (openssl_csr_export($csrItem, $exportedArray[$index], true)) {
echo "CSR $index экспортирован\n";
}
}
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;
}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())
const openssl = require('openssl-wrapper');
openssl.exec('req -in request.csr -text -noout', function(err, buffer) {
console.log(buffer.toString());
});
# Просмотр содержимого CSR
openssl req -in request.csr -text -noout
# Экспорт в формате PEM (уже по умолчанию)
openssl req -in request.csr -out request.pem