Signatur
Beschreibung
Mit openssl_csr_new() wird ein Certificate Signing Request (CSR) erstellt – eine standardisierte Anfrage (PKCS#10), die Informationen über den Antragsteller (Distinguished Names) sowie den zugehörigen öffentlichen Schlüssel enthält und bei einer Zertifizierungsstelle (CA) eingereicht werden kann, um ein TLS/SSL-Zertifikat zu erhalten.
Der Parameter $distinguished_names enthält Felder wie commonName, organizationName, countryName usw. Der Parameter $private_key wird entweder als bereits vorhandener Schlüssel übergeben oder – wenn er leer bzw. null ist – von der Funktion neu erzeugt und in der referenzierten Variable gespeichert.
Über $options können CSR-spezifische OpenSSL-Konfigurationsoptionen (z. B. digest_alg, private_key_bits, private_key_type, config) gesteuert werden. Damit lassen sich eigene openssl.cnf-Dateien einbinden oder der Signaturalgorithmus anpassen. $extra_attribs erlaubt das Hinzufügen weiterer PKCS#9-Attribute zum CSR.
Die Funktion wird typischerweise in einem zweistufigen Workflow verwendet: Zuerst wird mit openssl_csr_new() der CSR erzeugt, anschließend entweder bei einer CA eingereicht oder mit openssl_csr_sign() selbst signiert, um ein self-signed Zertifikat zu erhalten.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $distinguished_names Pflicht | array | Assoziatives Array mit den Distinguished-Name-Feldern des Zertifikatsinhabers. Gültige Schlüssel sind z. B. commonName (CN), countryName (C), stateOrProvinceName (ST), localityName (L), organizationName (O), organizationalUnitName (OU) und emailAddress. |
|
| $private_key Pflicht | OpenSSLAsymmetricKey | Referenz auf einen privaten Schlüssel. Wird ein gültiges OpenSSLAsymmetricKey-Objekt übergeben, wird dieser Schlüssel verwendet; andernfalls erzeugt die Funktion einen neuen Schlüssel und speichert ihn in dieser Variable. |
|
| $options | array|null | null | Optionales assoziatives Array mit OpenSSL-Konfigurationsoptionen. Mögliche Schlüssel: digest_alg (Signaturalgorithmus, z. B. sha256), private_key_bits (Schlüssellänge in Bit), private_key_type (z. B. OPENSSL_KEYTYPE_RSA), encrypt_key (Boolean), config (Pfad zu einer eigenen openssl.cnf). |
| $extra_attribs | array|null | null | Optionales assoziatives Array mit zusätzlichen PKCS#9-Attributen, die in den CSR aufgenommen werden sollen, z. B. subjectAltName oder challengePassword. |
Rückgabewert
OpenSSLCertificateSigningRequest-Objekt zurück (vor PHP 8.0 eine Ressource), das mit anderen OpenSSL-Funktionen weiterverarbeitet werden kann. Im Fehlerfall wird false zurückgegeben und ein Fehler in die OpenSSL-Fehlerwarteschlange geschrieben, die mit openssl_error_string() ausgelesen werden kann.Beispiele
Einfachen CSR mit neuem RSA-Schlüssel erzeugen
<?php
$dn = [
'countryName' => 'DE',
'stateOrProvinceName' => 'Bayern',
'localityName' => 'München',
'organizationName' => 'Beispiel GmbH',
'organizationalUnitName' => 'IT-Abteilung',
'commonName' => 'www.beispiel.de',
'emailAddress' => 'admin@beispiel.de',
];
$config = [
'digest_alg' => 'sha256',
'private_key_bits' => 2048,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
];
// $privateKey wird von openssl_csr_new befüllt
$privateKey = null;
$csr = openssl_csr_new($dn, $privateKey, $config);
if ($csr === false) {
while ($msg = openssl_error_string()) {
echo 'OpenSSL-Fehler: ' . $msg . PHP_EOL;
}
exit(1);
}
// CSR als PEM-String ausgeben
openssl_csr_export($csr, $csrPem);
echo $csrPem;
// Privaten Schlüssel sicher speichern
openssl_pkey_export($privateKey, $privateKeyPem);
file_put_contents('/tmp/private.key', $privateKeyPem);
echo 'Schlüssel und CSR erfolgreich erzeugt.' . PHP_EOL;
CSR erzeugen und direkt selbst signieren (self-signed Zertifikat)
<?php
$dn = [
'countryName' => 'DE',
'commonName' => 'localhost',
'emailAddress' => 'dev@localhost',
];
$config = [
'digest_alg' => 'sha256',
'private_key_bits' => 4096,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
];
$privateKey = null;
$csr = openssl_csr_new($dn, $privateKey, $config);
if ($csr === false) {
die('CSR-Erzeugung fehlgeschlagen.');
}
// CSR mit dem eigenen Schlüssel signieren → self-signed Zertifikat, gültig 365 Tage
$cert = openssl_csr_sign($csr, null, $privateKey, 365, $config);
openssl_x509_export($cert, $certPem);
openssl_pkey_export($privateKey, $keyPem);
file_put_contents('/tmp/selfsigned.crt', $certPem);
file_put_contents('/tmp/selfsigned.key', $keyPem);
echo 'Self-signed Zertifikat und Schlüssel wurden gespeichert.' . PHP_EOL;
// Wichtig · Fallstricke
Sicherheitshinweise:
- Den erzeugten privaten Schlüssel niemals im Webroot ablegen oder unverschlüsselt übertragen. Für Produktivumgebungen empfiehlt sich eine Schlüssellänge von mindestens
2048Bit für RSA (besser 4096) oder die Verwendung von ECDSA (OPENSSL_KEYTYPE_EC). - Den CSR vor der Einreichung bei einer CA stets auf korrekte Distinguished Names prüfen – Fehler können dazu führen, dass das Zertifikat für die falsche Domain ausgestellt wird.
- Ab PHP 8.0 wird statt einer OpenSSL-Ressource ein
OpenSSLCertificateSigningRequest-Objekt zurückgegeben. Code, deris_resource()verwendet, muss entsprechend angepasst werden. - Wenn keine
openssl.cnfgefunden wird, kann die Funktion fehlschlagen. Über denconfig-Schlüssel in$optionskann eine eigene Konfigurationsdatei angegeben werden. - Die Fehlerbehandlung sollte immer
openssl_error_string()in einer Schleife aufrufen, da mehrere Fehler in der Warteschlange liegen können.