(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
openssl_csr_new — Генерирует CSR
$distinguished_names,&$private_key,$options = null,$extra_attributes = null
Функция openssl_csr_new() создаёт новый CSR
на основе информации, которую задали в параметре distinguished_names.
Замечание: Для корректной работы этой функции должен существовать правильный openssl.cnf. Для более подробной информации смотрите замечания под разделом установки.
distinguished_names
Уникальное имя (Distinguished Name) или поля субъекта для
сертификата.
Параметр distinguished_names — это ассоциативный массив,
в котором ключи представляют имена атрибутов уникальных имён,
а значения могут быть либо строками (для одного значения),
либо массивами (если необходимо установить несколько значений).
private_key
Для параметра private_key требуется установить закрытый ключ,
который сгенерировала функция openssl_pkey_new() (или
который вернула любая другая функция семейства openssl_pkey) или null.
Если значение переменной null, то создаётся новый закрытый ключ на основе
предоставленного параметра options и присваивается предоставленной переменной.
Соответствующую открытую часть ключа функция использует, чтобы
подписать CSR.
options
По умолчанию для инициализации запроса используется информация из
системного файла openssl.conf. Можно указать
секцию конфигурационного файла путём задания ключа
config_section_section в
параметре options. Можно также задать альтернативный
файл конфигурации OpenSSL путём задания ключа
config значением пути до него.
Соответствие ключей, которые указали в параметре options,
ключам из файла openssl.conf дают следующие параграфы описания.
Ключ options |
Тип | Соответствие в openssl.conf |
Описание |
|---|---|---|---|
| digest_alg | string | default_md | Один из методов openssl_get_md_methods() |
| x509_extensions | string | x509_extensions | Определяет, какое расширение должно использоваться, чтобы создать сертификат x509 |
| req_extensions | string | req_extensions | Определяет, какое расширение должно использоваться для создания CSR |
| private_key_bits | int | default_bits | Задаёт, сколько бит должно использоваться для генерации закрытого ключа |
| private_key_type | int | none | Задаёт тип создаваемого закрытого ключа. Одна из констант:
OPENSSL_KEYTYPE_DSA,
OPENSSL_KEYTYPE_DH,
OPENSSL_KEYTYPE_RSA или
OPENSSL_KEYTYPE_EC.
По умолчанию OPENSSL_KEYTYPE_RSA.
|
| encrypt_key | bool | encrypt_key | Должен ли шифроваться (паролем) экспортируемый ключ? |
| encrypt_key_cipher | int | none | Одна из констант шифров. |
| curve_name | string | none | Одно из openssl_get_curve_names(). |
| config | string | N/A | Путь до альтернативного файла конфигурации openssl.conf. |
extra_attributes
Параметр extra_attributes используется для указания дополнительных
опций для CSR.
Это ассоциативные массивы, в которых ключи преобразуются в OID
и применяются в качестве атрибутов CSR.
Функция возвращает CSR в случае успешного выполнения,
true, в случае успешного создания CSR, но при возникновении ошибки подписания или false, если возникла ошибка.
| Версия | Описание |
|---|---|
| 8.4.0 |
Ассоциативный массив distinguished_names теперь поддерживает
массивы в качестве значений, что позволяет указывать несколько значений для одного атрибута.
|
| 8.4.0 |
Параметр extra_attributes теперь правильно устанавливает атрибуты CSR,
а не изменяет уникальное имя субъекта, как это было ранее.
|
| 8.0.0 |
csr теперь принимает экземпляр OpenSSLCertificateSigningRequest;
ранее принимался ресурс (resource) типа OpenSSL X.509 CSR.
|
| 8.0.0 |
private_key теперь принимает экземпляр OpenSSLAsymmetricKey;
ранее принимался ресурс (resource) типа OpenSSL key.
|
| 7.1.0 |
Параметр options теперь поддерживает
curve_name.
|
Пример #1 Создание самоподписанного сертификата
<?php
// для сервера сертификации SSL, commonName является доменным именем
// для сертификатов S/MIME, commonName является владельцем расположения адреса email
// и поля идентификации относятся к владельцу домена или электронной почты,
// подлежащим защите
$dn = array(
"countryName" => "GB",
"stateOrProvinceName" => "Somerset",
"localityName" => "Glastonbury",
"organizationName" => "The Brain Room Limited",
"organizationalUnitName" => "PHP Documentation Team",
"commonName" => "Wez Furlong",
"emailAddress" => "wez@example.com"
);
// Создание пары закрытый/открытый ключ
$privkey = openssl_pkey_new(array(
"private_key_bits" => 2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
));
// Создание CSR
$csr = openssl_csr_new($dn, $privkey, array('digest_alg' => 'sha256'));
// Создание самоподписанного сертификата со сроком жизни 365 дней
$x509 = openssl_csr_sign($csr, null, $privkey, $days=365, array('digest_alg' => 'sha256'));
// Сохранение закрытого ключа, CSR и самоподписанного сертификата
openssl_csr_export($csr, $csrout) and var_dump($csrout);
openssl_x509_export($x509, $certout) and var_dump($certout);
openssl_pkey_export($privkey, $pkeyout, "mypassword") and var_dump($pkeyout);
// Покажем возникшие ошибки, если они были
while (($e = openssl_error_string()) !== false) {
echo $e . "\n";
}
?>Пример #2 Создание самоподписанного ECC сертификата (начиная с PHP 7.1.0)
<?php
$subject = array(
"commonName" => "docs.php.net",
);
// Создание пары закрытый/открытый ключ
$private_key = openssl_pkey_new(array(
"private_key_type" => OPENSSL_KEYTYPE_EC,
"curve_name" => 'prime256v1',
));
// Создание CSR
$csr = openssl_csr_new($subject, $private_key, array('digest_alg' => 'sha384'));
// Создание самоподписанного EC сертификата
$x509 = openssl_csr_sign($csr, null, $private_key, $days=365, array('digest_alg' => 'sha384'));
openssl_x509_export_to_file($x509, 'ecc-cert.pem');
openssl_pkey_export_to_file($private_key, 'ecc-private.key');
?>