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,
    OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key,
    int $days,
    ?array $options = null,
    int $serial = 0
): OpenSSLCertificate|false

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

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

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

csr

Созданный с помощью openssl_csr_new() CSR. Также может быть путём на кодированный в 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.

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

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

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

Версия Описание
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";
}
?>

add a note add a note

User Contributed Notes 4 notes

up
0
Sriraam
9 years ago
config_section_section is incorrect. The correct keyword to use is "config_section_name".
up
0
thomas dot lussnig at bewegungsmelder dot de
22 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
0
eric at ypass dot net
22 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
-4
Kai Sellgren
15 years ago
You can use file_get_contents() to directly pass the content instead of giving file paths.

Also, if you get an error "sec_error_reused_issuer_and_serial", put a serial into the last parameter:

<?php

$privkey
= array(file_get_contents('ca.key'),"your_ca_key_passphrase");
$usercert = openssl_csr_sign($csrdata, file_get_contents('ca.crt'),$privkey,365,NULL,'06');
openssl_x509_export($usercert,$certout);
file_put_contents('serverCASigned.crt',$certout);

?>

In that above example the serial was "06".
To Top