Start · Sprachen · PHP · Referenz · openssl_csr_new

openssl_csr_new

Funktion

Erzeugt einen Certificate Signing Request (CSR) auf Basis von Distinguished Names und einem privaten Schlüssel.

seit PHP 4.2.0 Kategorie: crypto

Signatur

openssl_csr_new(array $distinguished_names, OpenSSLAsymmetricKey &$private_key, ?array $options = null, ?array $extra_attribs = null): OpenSSLCertificateSigningRequest|false

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

Typ
OpenSSLCertificateSigningRequest|false
Beschreibung
Gibt bei Erfolg ein 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;
-----BEGIN CERTIFICATE REQUEST----- ... -----END CERTIFICATE REQUEST----- Schlüssel und CSR erfolgreich erzeugt.

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;
Self-signed Zertifikat und Schlüssel wurden gespeichert.

// 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 2048 Bit 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, der is_resource() verwendet, muss entsprechend angepasst werden.
  • Wenn keine openssl.cnf gefunden wird, kann die Funktion fehlschlagen. Über den config-Schlüssel in $options kann 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.