PHP 5.4.31 Released

openssl_csr_sign

(PHP 4 >= 4.2.0, PHP 5)

openssl_csr_signSigniert einen CSR mit einem anderen Zertifikat (oder sich selbst) und generiert ein Zertifikat

Beschreibung

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

openssl_csr_sign() erzeugt eine x509 Zertifikatressource aus dem übergebenen CSR.

Hinweis: Die ordnungsgemäße Ausführung dieser Funktion setzt die Installation einer gültigen openssl.cnf-Datei voraus. Mehr Information hierzu finden sie im Installationsabschnitt.

Parameter-Liste

csr

Ein zuvor mit openssl_csr_new() erzeugter CSR. Es kann sich aber auch um den Pfad zu einer PEM-kodierten CSR-Datei in der Form file://path/to/csr handeln oder einen String wie von openssl_csr_export() zurückgegeben.

cacert

Das generierte Zertifikat wird mit cacert signiert. Falls Sie hier NULL angeben wird ein selbstsigniertes Zertifikat erstellt.

priv_key

priv_key ist der zu cacert gehörende private Schlüssel.

days

days Die Gültigkeitsdauer des Zertifikats, in Tagen.

configargs

Mit configargs können Sie die Signierung des CSR feiner abstimmen. Für weitere Informationen lesen Sie bitte openssl_csr_new().

serial

Eine optionale Seriennummer für das ausgestellte Zertifikat. Wenn nicht abgegeben wird der Standardwert 0 verwendet.

Rückgabewerte

Gibt bei Erfolg eine x509 Zertifikat-Ressource zurück, FALSE bei einem Fehler.

Changelog

Version Beschreibung
4.3.3 Der Parameter serial wurde hinzugefügt.

Beispiele

Beispiel #1 openssl_csr_sign() example - signing a CSR (how to implement your own CA)

<?php
// Annahme: dieses Skript erhält einen CSR, der auf einer anderen Seite in
// eine Textarea eingegeben wurde.
$csrdata $_POST["CSR"];

// Wir werden die Anfrage mit unserem eigenen ""certificate authority"
// Zertifikat signieren. Sie können jedes beliebige Zertifikat verwenden, um
// ein anderes zu signieren. Aber das Ganze ist ziemlich nutzlos, solange die
// Software/Benutzer, die dieses neu signierte Zertifikat nutzen werden, dem
// signierenden Zertifikat 

// Wir brauchen unser CA Zertifikat und dessen privaten Schlüssel
$cacert "file://path/to/ca.crt";
$privkey = array("file://path/to/ca.key""your_ca_key_passphrase");

$userscert openssl_csr_sign($csrdata$cacert$privkey365);

// Jetzt zeigem wir das generierte Zertifikat an, damit die Benutzer es
// kopieren und in ihre lokale Konfiguration einfügen können (wie z.B. eine
// Datei, die das Zertifikat für ihren SSL Server enthalten soll.
openssl_x509_export($usercert$certout);
echo 
$certout;

// Anzeigen der möglichen aufgetretenen Fehler
while (($e openssl_error_string()) !== false) {
    echo 
$e "\n";
}
?>

add a note add a note

User Contributed Notes 3 notes

up
1
thomas dot lussnig at bewegungsmelder dot de
12 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
Kai Sellgren
5 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".
up
0
eric at ypass dot net
12 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);
To Top