openssl_csr_sign

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

openssl_csr_signПодписать CSR с помощью другого сертификата (или им же) и создать сертификат

Описание

resource openssl_csr_sign ( mixed $csr , mixed $cacert , mixed $priv_key , int $days [, array $configargs [, int $serial = 0 ]] )

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

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

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

csr

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

cacert

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

priv_key

priv_key - секретный ключ, соответствующий cacert.

days

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

configargs

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

serial

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

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

Возвращает ресурс сертификата x509, либо FALSE, если что-то пошло не так.

Примеры

Пример #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$privkey365, 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
2 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
15 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
15 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
-3
Kai Sellgren
8 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