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

Создание CSR с помощью openssl_csr_new в PHP
Раздел: Шифрование (OpenSSL)
openssl_csr_new(array $distinguished_names, OpenSSLAsymmetricKey &$private_key, ?array $options = null, ?array $extra_attributes = null): OpenSSLCertificateSigningRequest|false

Функция openssl_csr_new

Функция openssl_csr_new() создает новый запрос на подпись сертификата (Certificate Signing Request, CSR). Этот CSR отправляется в центры сертификации для выпуска SSL-сертификатов. Функция доступна в PHP при подключении модуля OpenSSL.

Аргументы функции
  • $distinguished_names - Ассоциативный массив с данными субъекта сертификата (например, commonName, organizationName).
  • $private_key - Ссылка на приватный ключ, который будет связан с CSR.
  • $options - Необязательный массив конфигурационных опций (например, digest_alg, x509_extensions).
  • $extra_attributes - Необязательный массив дополнительных атрибутов (используется редко).

Функция возвращает CSR в формате ресурса (до PHP 8.0) или объекта OpenSSLCertificateSigningRequest (начиная с PHP 8.0), либо false при ошибке.

Примеры использования

Создание базового CSR
$dn = [
    "commonName" => "example.com",
    "organizationName" => "ООО Пример"
];
$privkey = openssl_pkey_new(["private_key_bits" => 2048]);
$csr = openssl_csr_new($dn, $privkey);
if ($csr) {
    openssl_csr_export($csr, $csr_out);
    echo $csr_out;
}
-----BEGIN CERTIFICATE REQUEST-----
MIICzDCCAbQCAQAwgYAxCzAJBgNVBAYTAlJVMRMwEQYDVQQIDArQnNC+0YHQutCy...
-----END CERTIFICATE REQUEST-----
CSR с дополнительными опциями
$options = [
    "digest_alg" => "sha256",
    "config" => "openssl.cnf",
    "req_extensions" => "v3_req"
];
$csr = openssl_csr_new($dn, $privkey, $options);
CSR с использованием SHA-256 и расширений v3.

Альтернативные функции PHP

  • openssl_pkey_new() - Создает новую пару ключей (приватный и публичный). Используется совместно с openssl_csr_new().
  • openssl_csr_sign() - Подписывает CSR для создания сертификата. Применяется после получения CSR для генерации конечного сертификата.
  • openssl_csr_export() - Экспортирует CSR в строку PEM-формата. Используется для вывода или сохранения CSR.

Функция openssl_csr_new() является основной для генерации CSR, другие функции дополняют процесс.

Типичные ошибки

Неверный массив distinguished_names
$dn = ["name" => "example.com"];
$privkey = openssl_pkey_new(["private_key_bits" => 2048]);
$csr = openssl_csr_new($dn, $privkey);
if (!$csr) {
    echo "Ошибка: ".openssl_error_string();
}
Ошибка: error:0D07A098:asn1 encoding routines:ASN1_mbstring_ncopy:string too long
Отсутствие приватного ключа
$dn = ["commonName" => "example.com"];
$csr = openssl_csr_new($dn, null);
Warning: openssl_csr_new(): key array must be of the form array(0 => key, 1 => phrase)

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

  • PHP 8.0: Функция теперь возвращает объект OpenSSLCertificateSigningRequest вместо ресурса. Неверные типы аргументов вызывают TypeError.
  • PHP 7.0: Добавлена поддержка параметра $options для указания конфигурационного файла OpenSSL.
  • PHP 5.6: Улучшена обработка ошибок и добавлены новые опции в массив $options.

Расширенные примеры

CSR с альтернативными именами (SAN)
Пример php
$dn = ["commonName" => "example.com"];
$options = [
    "req_extensions" => "v3_req",
    "config" => __DIR__."/openssl.cnf"
];
$privkey = openssl_pkey_new();
$csr = openssl_csr_new($dn, $privkey, $options);
openssl_csr_export($csr, $csr_out);
// Добавление SAN вручную через конфигурационный файл
CSR с расширениями X.509 v3.
Использование существующего приватного ключа
Пример php
$privkey = openssl_pkey_get_private("file://private.key");
$dn = ["commonName" => "example.com"];
$csr = openssl_csr_new($dn, $privkey);
openssl_csr_export($csr, $csr_out);
echo $csr_out;
-----BEGIN CERTIFICATE REQUEST-----
MIICzDCCAbQCAQAwgYAxCzAJBgNVBAYTAlJVMRMwEQYDVQQIDArQnNC+0YHQutCy...
-----END CERTIFICATE REQUEST-----
CSR с заданным алгоритмом подписи
Пример php
$options = ["digest_alg" => "sha384"];
$csr = openssl_csr_new($dn, $privkey, $options);
CSR подписан с использованием SHA-384.

Альтернативы в других языках

Python (cryptography)
from cryptography import x509
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa
private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
csr = x509.CertificateSigningRequestBuilder().subject_name(x509.Name([
    x509.NameAttribute(NameOID.COMMON_NAME, "example.com")])).sign(private_key, hashes.SHA256())
print(csr.public_bytes(serialization.Encoding.PEM).decode())
-----BEGIN CERTIFICATE REQUEST-----
MIIBODCB4QIBADAWMRQwEgYDVQQDEwtleGFtcGxlLmNvbTBZMBMGByqGSM49AgEG...
-----END CERTIFICATE REQUEST-----
JavaScript (Node.js, forge)
const forge = require('node-forge');
const keys = forge.pki.rsa.generateKeyPair(2048);
const csr = forge.pki.createCertificationRequest();
csr.publicKey = keys.publicKey;
csr.setSubject([{ name: 'commonName', value: 'example.com' }]);
csr.sign(keys.privateKey);
const pem = forge.pki.certificationRequestToPem(csr);
console.log(pem);
-----BEGIN CERTIFICATE REQUEST-----
MIIBODCB4QIBADAWMRQwEgYDVQQDEwtleGFtcGxlLmNvbTBZMBMGByqGSM49AgEG...
-----END CERTIFICATE REQUEST-----

В отличие от PHP, другие языки часто используют библиотеки для работы с криптографией.

PHP openssl_csr_new function comments

En
Openssl csr new Generates a CSR