config_section_section is incorrect. The correct keyword to use is "config_section_name".
(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
openssl_csr_sign — Signiert einen CSR mit einem anderen Zertifikat (oder sich selbst) und generiert ein Zertifikat
$csr
,$ca_certificate
,$private_key
,$days
,$options
= null
,$serial
= 0openssl_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 sind im Abschnitt Installation zu finden.
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 eine Zeichenkette wie von openssl_csr_export() zurückgegeben.
ca_certificate
Das generierte Zertifikat wird mit
ca_certificate
signiert. Falls hier null
angegeben wird, wird ein selbstsigniertes Zertifikat erstellt.
private_key
private_key
ist der zu
ca_certificate
gehörende private Schlüssel.
days
days
gibt die Gültigkeitsdauer des Zertifikats
in Tagen an.
options
Mit options
kann die Signierung des
CSR feiner abgestimmt werden. Weitere Informationen
zu options
sind
openssl_csr_new() zu entnehmen.
serial
Eine optionale Seriennummer für das ausgestellte Zertifikat. Wenn nicht angegeben, wird der Standardwert 0 verwendet.
Gibt bei Erfolg ein OpenSSLCertificate zurück,
false
bei einem Fehler.
Version | Beschreibung |
---|---|
8.0.0 |
Bei Erfolg gibt diese Funktion nun eine
OpenSSLCertificate-Instanz zurück; vorher wurde
eine Ressource vom Typ OpenSSL X.509 zurückgegeben.
|
8.0.0 |
csr akzeptiert nun eine
OpenSSLCertificateSigningRequest-Instanz; vorher
wurde eine Ressource vom Typ OpenSSL X.509 CSR
akzeptiert.
|
8.0.0 |
ca_certificate akzeptiert nun eine
OpenSSLCertificate-Instanz; vorher wurde eine
Ressource vom Typ OpenSSL X.509 akzeptiert.
|
8.0.0 |
private_key akzeptiert nun eine
OpenSSLAsymmetricKey- oder
OpenSSLCertificate-Instanz; vorher wurde eine
Ressource vom Typ OpenSSL-Schlüssel oder
OpenSSL X.509 akzeptiert.
|
Beispiel #1 openssl_csr_sign()-Beispiel - Signieren eines CSR (wie eine eigene CA implementiert wird)
<?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 nicht vertrauen.
// Wir benötigen 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");
$usercert = openssl_csr_sign($csrdata, $cacert, $privkey, 365, array('digest_alg'=>'sha256') );
// Jetzt zeigen 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 aller aufgetretenen Fehler
while (($e = openssl_error_string()) !== false) {
echo $e . "\n";
}
?>
config_section_section is incorrect. The correct keyword to use is "config_section_name".
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";
?>
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);
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".