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";
?>
openssl_csr_sign
(PHP 4 >= 4.2.0, PHP 5)
openssl_csr_sign — Signiert einen CSR mit einem anderen Zertifikat (oder sich selbst) und generiert ein Zertifikat
Beschreibung
openssl_csr_sign() erzeugt eine x509 Zertifikatressource aus dem übergebenen CSR.
Hinweis: Damit diese Funktion korrekt arbeiten kann, benötigen Sie eine installierte, gültige Konfigurationsdatei openssl.cnf. Für weitere Informationen beachten Sie bitte die Hinweise im Abschnitt Installation.
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, $privkey, 365);
// 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";
}
?>
openssl_csr_sign
11-Jul-2002 08:34
13-Jun-2002 04:13
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);
