Signatur
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
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;
}
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";
}
}
// Wichtig · Fallstricke
Sicherheitshinweise:
- Verwende stets
sha256oder stärker alsdigest_alg. Ältere Algorithmen wiemd5odersha1gelten 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.