openssl_csr_sign

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

openssl_csr_signПодписывает CSR через другой сертификат (или им же) и создаёт сертификат

Описание

openssl_csr_sign(
    OpenSSLCertificateSigningRequest|string $csr,
    OpenSSLCertificate|string|null $ca_certificate,
    #[\SensitiveParameter] OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key,
    int $days,
    ?array $options = null,
    int $serial = 0,
    ?string $serial_hex = null
): OpenSSLCertificate|false

Функция openssl_csr_sign() создаёт сертификат x509 из заданного CSR.

Замечание: Для корректной работы этой функции должен существовать правильный openssl.cnf. Для более подробной информации смотрите замечания под разделом установки.

Список параметров

csr

CSR, который создала функция openssl_csr_new(). Также может быть путём на кодированный в PEM CSR, если задано как file://path/to/csr или экспортированной строкой, созданной с помощью openssl_csr_export().

ca_certificate

Создаваемый сертификат будет подписан ca_certificate. Если ca_certificate задан как null, то будет сгенерирован самоподписанный сертификат.

private_key

private_key — секретный ключ, который соответствует ca_certificate.

days

days — время жизни создаваемого сертификата в днях.

options

Можно тонко настроить подпись CSR через параметр options. Подробности даёт описание функции openssl_csr_new(), в разделе, который посвящён параметру options.

serial

Опциональный серийный номер выпускаемого сертификата. Если не указано, то по умолчанию будет использован 0.

serial_hex

Необязательная шестнадцатеричная строка, представляющая серийный номер выданного сертификата. Если задана, она приоритетнее значения параметра serial. Если не указана или задана как null, вместо неё используется значение параметра serial.

Возвращаемые значения

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

Список изменений

Версия Описание
8.4.0 Добавлен параметр serial_hex.
8.0.0 On success, this function returns an OpenSSLCertificate instance now; previously, a resource of type OpenSSL X.509 was returned.
8.0.0 csr теперь принимает экземпляр OpenSSLCertificateSigningRequest; ранее принимался ресурс (resource) типа OpenSSL X.509 CSR.
8.0.0 ca_certificate теперь принимает экземпляр OpenSSLCertificate; ранее принимался ресурс (resource) типа OpenSSL X.509 CSR.
8.0.0 private_key теперь принимает экземпляр OpenSSLAsymmetricKey; ранее принимался ресурс (resource) типа OpenSSL X.509 CSR.

Примеры

Пример #1 Пример openssl_csr_sign() - подпись CSR (как сделать свой собственный CA)

<?php
// Предположим, что CSR получен из поля textarea со веб-страницы
$csrdata = $_POST["CSR"];

// Мы подпишем запрос с помощью сертификата собственного "центра сертификации"
// Для подписи вы можете использовать любой сертификат, но этот процесс бесполезен, если
// сертификат не является доверенным для ПО или пользователей, которые будут его
// использовать

// Нам нужен собственный CA сертификат и его секретный ключ
$cacert = "file://path/to/ca.crt";
$privkey = array("file://path/to/ca.key", "your_ca_key_passphrase");

$usercert = openssl_csr_sign($csrdata, $cacert, $privkey, 365, array('digest_alg'=>'sha256') );

// Теперь напечатаем сертификат, чтобы пользователь мог его скопировать
// и внести в свою локальную конфигурацию (например в файл хранилища SSL сертификатов)
openssl_x509_export($usercert, $certout);
echo
$certout;

// Покажем возникшие ошибки, если они были
while (($e = openssl_error_string()) !== false) {
echo
$e . "\n";
}
?>

Добавить

Примечания пользователей 4 notes

up
0
play dot it at play-it dot net
3 months ago
When using `openssl_csr_new()` or `openssl_csr_sign()` for X25519 or Ed25519 certs, you HAVE TO set the `["digest_alg" => ""]` or if you use the `"config"` option to `null`, like so:

<?php
// Setting the "digest_alg" option:
$csr = openssl_csr_new(
    $distinguished_names,
    $private_key,
    ["digest_alg" => ""]
);

// Setting with "config":
$csr = openssl_csr_new(
    $distinguished_names,
    $private_key,
    ["config" => "/path/to/openssl.conf"]
);
?>

openssl.conf
```
[req]
default_md = null
// ...
```
up
-1
eric at ypass dot net
23 years ago
To generate a self-signed certificate, pass NULL as the signing certificate (2nd parameter).  For example:

$req_key = openssl_pkey_new();
$dn = array(
    "countryName" => "US",
    "stateOrProvinceName" => "Colorado",
    "organizationName" => "yPass.net",
    "organizationalUnitName" => "yPass.net",
    "commonName" => "yPass.net Root Certificate"
);
$req_csr = openssl_csr_new($dn, $req_key);
$req_cert = openssl_csr_sign($req_csr, NULL, $req_key, 365);
up
-2
thomas dot lussnig at bewegungsmelder dot de
23 years ago
Here is an sample how to create valid X.509 Public and Private Key (cert/key).
When not using self signed the 4.2.1 segault. You need the CVS code at least for openssl.

<?
Header("Content-Type: text/plain");
$CA_CERT = "CA.cert.pem";
$CA_KEY  = "CA.key.pem";
$req_key = openssl_pkey_new();
if(openssl_pkey_export ($req_key, $out_key)) {
        $dn = array(
                "countryName"            => "DE",
                "stateOrProvinceName"    => "Frankfurt",
                "organizationName"       => "smcc.net",
                "organizationalUnitName" => "E-Mail",
                "commonName"             => "Testcert"
                );
        $req_csr  = openssl_csr_new ($dn, $req_key);
        $req_cert = openssl_csr_sign($req_csr, "file://$CA_CERT", "file://$CA_KEY", 365);
        if(openssl_x509_export ($req_cert, $out_cert)) {
                echo "$out_key\n";
                echo "$out_cert\n";
                }
        else    echo "Failed Cert\n";
        }
else            echo "FailedKey\n";
?>
up
-2
Sriraam
10 years ago
config_section_section is incorrect. The correct keyword to use is "config_section_name".
To Top