Start · Sprachen · PHP · Referenz · openssl_csr_sign

openssl_csr_sign

Funktion

Signiert einen CSR (Certificate Signing Request) mit einem CA-Zertifikat oder selbst und generiert daraus ein X.509-Zertifikat.

seit PHP 4.2.0 Kategorie: crypto

Signatur

openssl_csr_sign(OpenSSLCertificateSigningRequest|string $csr, OpenSSLCertificate|string|null $ca_certificate, OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key, int $days, array $options = [], int $serial = 0): OpenSSLCertificate|false

Beschreibung

openssl_csr_sign() verarbeitet einen Certificate Signing Request (CSR) und erzeugt daraus ein signiertes X.509-Zertifikat. Die Signatur kann entweder durch ein vorhandenes CA-Zertifikat (Certificate Authority) erfolgen oder – wenn ca_certificate null ist – als selbstsigniertes Zertifikat ausgestellt werden.

Typische Einsatzgebiete sind das Aufbauen einer eigenen kleinen PKI (Public Key Infrastructure), das Ausstellen von SSL/TLS-Zertifikaten für interne Dienste oder die Erstellung selbstsignierter Zertifikate für Entwicklungs- und Testzwecke. Der zugehörige private Schlüssel muss zum CA-Zertifikat passen, da er zum Signiervorgang verwendet wird.

Der options-Parameter erlaubt die Angabe eines digest_alg (z. B. sha256), eines x509_extensions-Eintrags aus der OpenSSL-Konfiguration sowie weiterer Steuerparameter. Das Ergebnis ist ein OpenSSLCertificate-Objekt, das mit openssl_x509_export() als PEM-String exportiert werden kann.

Seit PHP 8.0 werden OpenSSL-Ressourcen als Objekte des Typs OpenSSLCertificate bzw. OpenSSLAsymmetricKey zurückgegeben, sind aber weiterhin vollständig kompatibel mit den älteren Ressourcen-Handles aus PHP 7.

Parameter

Name Typ Default Beschreibung
$csr Pflicht OpenSSLCertificateSigningRequest|string Der zu signierende CSR. Kann ein OpenSSLCertificateSigningRequest-Objekt, ein PEM-kodierter String oder ein Pfad zu einer PEM-Datei im Format file://pfad/zur/datei.pem sein.
$ca_certificate Pflicht OpenSSLCertificate|string|null Das CA-Zertifikat, mit dem der CSR signiert werden soll. Wird null übergeben, wird ein selbstsigniertes Zertifikat erstellt. Andernfalls ein OpenSSLCertificate-Objekt, PEM-String oder Dateipfad.
$private_key Pflicht OpenSSLAsymmetricKey|OpenSSLCertificate|array|string Der private Schlüssel, der zum ca_certificate gehört. Kann ein OpenSSLAsymmetricKey-Objekt, ein PEM-String, ein Dateipfad oder ein Array der Form [mixed $key, string $passphrase] bei passwortgeschützten Schlüsseln sein.
$days Pflicht int Gültigkeitsdauer des ausgestellten Zertifikats in Tagen ab dem Ausstellungsdatum.
$options array [] Optionales Array zur Steuerung der Zertifikatserstellung. Unterstützte Schlüssel sind u. a. digest_alg (z. B. 'sha256'), x509_extensions, config (Pfad zu einer alternativen OpenSSL-Konfigurationsdatei) und encrypt_key.
$serial int 0 Seriennummer des ausgestellten Zertifikats. Sollte innerhalb einer CA eindeutig sein. Standard ist 0.

Rückgabewert

Typ
OpenSSLCertificate|false
Beschreibung
Gibt bei Erfolg ein OpenSSLCertificate-Objekt zurück, das das signierte Zertifikat repräsentiert. Im Fehlerfall wird false zurückgegeben und ein Fehler über openssl_error_string() abrufbar.

Beispiele

Selbstsigniertes Zertifikat erstellen

<?php
// Schlüsselpaar generieren
$privateKey = openssl_pkey_new([
    'private_key_bits' => 2048,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
]);

// CSR erstellen
$dn = [
    'commonName'             => 'example.local',
    'organizationName'       => 'Mein Unternehmen',
    'countryName'            => 'DE',
];
$csr = openssl_csr_new($dn, $privateKey, ['digest_alg' => 'sha256']);

// Selbstsigniertes Zertifikat ausstellen (ca_certificate = null)
$cert = openssl_csr_sign(
    csr: $csr,
    ca_certificate: null,
    private_key: $privateKey,
    days: 365,
    options: ['digest_alg' => 'sha256'],
    serial: 1
);

if ($cert === false) {
    echo 'Fehler: ' . openssl_error_string();
} else {
    openssl_x509_export($cert, $certPem);
    echo $certPem;
}
-----BEGIN CERTIFICATE----- ...(PEM-kodiertes Zertifikat)... -----END CERTIFICATE-----

CSR durch eine eigene CA signieren

<?php
// CA-Zertifikat und CA-Schlüssel aus Dateien laden
$caCert = openssl_x509_read(file_get_contents('/etc/ssl/ca/ca-cert.pem'));
$caKey  = openssl_pkey_get_private(
    file_get_contents('/etc/ssl/ca/ca-key.pem'),
    'geheimes-passwort'
);

// Den zu signierenden CSR laden (z. B. von einem Kunden erhalten)
$csrPem = file_get_contents('/tmp/server.csr');

// CSR durch die CA signieren – Gültigkeit 2 Jahre
$cert = openssl_csr_sign(
    csr: $csrPem,
    ca_certificate: $caCert,
    private_key: $caKey,
    days: 730,
    options: [
        'digest_alg'      => 'sha256',
        'x509_extensions' => 'v3_ca',
    ],
    serial: 42
);

if ($cert !== false) {
    openssl_x509_export_to_file($cert, '/tmp/server-signed.crt');
    echo "Zertifikat erfolgreich ausgestellt und gespeichert.\n";
} else {
    while ($error = openssl_error_string()) {
        echo 'OpenSSL-Fehler: ' . $error . "\n";
    }
}
Zertifikat erfolgreich ausgestellt und gespeichert.

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Verwende stets sha256 oder stärker als digest_alg. Ältere Algorithmen wie md5 oder sha1 gelten als unsicher und sollten nicht mehr eingesetzt werden.
  • Seriennummern (serial) müssen innerhalb einer CA eindeutig sein, da Zertifikatswiderruf (CRL/OCSP) anhand der Seriennummer funktioniert. Bei Produktionssystemen empfiehlt sich ein automatischer Zähler oder eine UUID-basierte Seriennummer.
  • Private CA-Schlüssel müssen sicher verwahrt und mit einer starken Passphrase geschützt werden.
  • Das erzeugte Zertifikat sollte mit openssl_x509_verify() oder externen Tools überprüft werden, bevor es in Produktion geht.
  • Selbstsignierte Zertifikate werden von Browsern und Clients standardmäßig abgelehnt und eignen sich nur für interne/Test-Umgebungen.