Start · Sprachen · PHP · Referenz · openssl_csr_export

openssl_csr_export

Funktion

Exportiert einen Certificate Signing Request (CSR) als PEM-kodierten String in eine Variable.

seit PHP 4.2.0 Kategorie: crypto

Signatur

openssl_csr_export(OpenSSLCertificateSigningRequest|string $csr, string &$output, bool $notext = true): bool

Beschreibung

openssl_csr_export() wandelt einen CSR-Ressource (oder eine PEM-Zeichenkette) in das menschenlesbare PEM-Format um und schreibt das Ergebnis in die übergebene Referenz-Variable $output. Die Funktion ist nützlich, wenn ein erzeugter CSR (z. B. mit openssl_csr_new()) als String gespeichert, in eine Datei geschrieben oder an eine Zertifizierungsstelle übermittelt werden soll.

Der optionale Parameter $notext steuert, ob zusätzliche Klartextinformationen (z. B. Subject, Public-Key-Algorithmus, Gültigkeit) oberhalb des PEM-Blocks in den Export aufgenommen werden. Standardmäßig ist dieser auf true gesetzt, sodass nur der reine PEM-Block ausgegeben wird. Setzt man ihn auf false, werden die menschenlesbaren Zusatzinformationen vorangestellt — hilfreich zur Inspektion, aber ungeeignet für maschinelle Weiterverarbeitung.

Die Funktion gibt true zurück, wenn der Export erfolgreich war, andernfalls false. Im Fehlerfall können über openssl_error_string() weitere Informationen abgerufen werden.

Typische Einsatzszenarien sind die Erzeugung von CSRs für TLS-Zertifikate, die anschließend an eine CA weitergegeben werden, sowie die persistente Speicherung von CSRs in Dateien oder Datenbanken.

Parameter

Name Typ Default Beschreibung
$csr Pflicht OpenSSLCertificateSigningRequest|string Der zu exportierende CSR. Kann ein OpenSSLCertificateSigningRequest-Objekt (ab PHP 8.0) oder eine PEM-kodierte Zeichenkette mit einem CSR sein.
$output Pflicht string Referenz auf eine Variable, in die der PEM-kodierte CSR geschrieben wird. Der vorherige Inhalt der Variable wird überschrieben.
$notext bool true Ist dieser Wert true (Standard), wird ausschließlich der PEM-Block exportiert. Bei false werden zusätzlich menschenlesbare Informationen zum CSR vor dem PEM-Block eingefügt.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Export erfolgreich war. Bei einem Fehler (z. B. ungültiger CSR) wird false zurückgegeben. Fehlerdetails können mit openssl_error_string() abgerufen werden.

Beispiele

CSR erzeugen und als PEM-String exportieren

<?php
$config = [
    'digest_alg'       => 'sha256',
    'private_key_bits' => 2048,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
];

// Privaten Schlüssel erzeugen
$privateKey = openssl_pkey_new($config);

// Distinguished Name für den CSR
$dn = [
    'countryName'            => 'DE',
    'stateOrProvinceName'    => 'Bayern',
    'localityName'           => 'München',
    'organizationName'       => 'Meine Firma GmbH',
    'commonName'             => 'www.beispiel.de',
    'emailAddress'           => 'admin@beispiel.de',
];

// CSR erzeugen
$csr = openssl_csr_new($dn, $privateKey, $config);

// CSR als PEM-String exportieren
if (openssl_csr_export($csr, $csrPem)) {
    echo $csrPem;
} else {
    echo 'Fehler beim Exportieren: ' . openssl_error_string();
}
-----BEGIN CERTIFICATE REQUEST----- MIIC...base64-Daten... -----END CERTIFICATE REQUEST-----

CSR mit menschenlesbaren Zusatzinformationen exportieren

<?php
$config = [
    'digest_alg'       => 'sha256',
    'private_key_bits' => 2048,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
];

$privateKey = openssl_pkey_new($config);

$dn = [
    'commonName'   => 'api.beispiel.de',
    'countryName'  => 'DE',
];

$csr = openssl_csr_new($dn, $privateKey, $config);

// notext = false => Klartext-Infos werden vorangestellt
if (openssl_csr_export($csr, $csrPem, false)) {
    // Kompletten PEM inkl. Klartextinfos in Datei speichern
    file_put_contents('/tmp/mein_csr.pem', $csrPem);
    echo "CSR erfolgreich gespeichert.\n";
} else {
    echo 'Fehler: ' . openssl_error_string();
}
CSR erfolgreich gespeichert.

// Wichtig · Fallstricke

Sicherheitshinweis: Der exportierte CSR enthält den öffentlichen Schlüssel sowie die Antragstellerdaten, ist also nicht geheim. Der zugehörige private Schlüssel sollte niemals zusammen mit dem CSR übertragen oder ungeschützt gespeichert werden.

Ab PHP 8.0 ersetzt das Objekt vom Typ OpenSSLCertificateSigningRequest die frühere Ressource vom Typ resource. Älterer Code, der auf is_resource() prüft, muss angepasst werden.

Falls openssl_csr_export() false zurückgibt, sollte openssl_error_string() in einer Schleife aufgerufen werden, da der OpenSSL-Fehler-Stack mehrere Einträge enthalten kann.