Start · Sprachen · PHP · Referenz · openssl_x509_checkpurpose

openssl_x509_checkpurpose

Funktion

Überprüft, ob ein X.509-Zertifikat für einen bestimmten Verwendungszweck (z. B. SSL-Client, E-Mail-Signierung) gültig und vertrauenswürdig ist.

seit PHP 4.0.6 Kategorie: crypto

Signatur

openssl_x509_checkpurpose(OpenSSLCertificate|string $certificate, int $purpose, array $ca_info = [], string|null $untrusted_certificates_file = null): bool|int

Beschreibung

openssl_x509_checkpurpose() prüft, ob ein gegebenes X.509-Zertifikat für einen bestimmten kryptografischen Zweck geeignet ist. Dabei wird sowohl die Gültigkeit der Zertifikatskette als auch die in der Erweiterung Key Usage bzw. Extended Key Usage eingetragenen Verwendungszwecke berücksichtigt. Die Funktion ist besonders nützlich, wenn Zertifikate vor ihrer Verwendung im eigenen System validiert werden sollen.

Der Parameter purpose wird über vordefinierte Konstanten angegeben, z. B. X509_PURPOSE_SSL_CLIENT, X509_PURPOSE_SSL_SERVER, X509_PURPOSE_SMIME_SIGN oder X509_PURPOSE_ANY. Diese Konstanten decken die häufigsten Anwendungsszenarien für Zertifikate ab.

Über das Array ca_info können vertrauenswürdige CA-Zertifikate bzw. Verzeichnisse mit CA-Zertifikaten angegeben werden. Schlüssel file verweist auf eine einzelne CA-Datei (PEM-Format mit mehreren Zertifikaten möglich), dir auf ein Verzeichnis mit Hash-benannten CA-Dateien. Optional können über untrusted_certificates_file weitere Zwischenzertifikate geladen werden, die bei der Kettenvalidierung herangezogen werden, ohne ihnen zu vertrauen.

Die Funktion gibt true zurück, wenn das Zertifikat für den angegebenen Zweck geeignet ist, false, wenn nicht, und -1 bei einem Fehler. Dies ermöglicht eine präzise Fallunterscheidung bei der Auswertung.

Parameter

Name Typ Default Beschreibung
$certificate Pflicht OpenSSLCertificate|string Das zu prüfende X.509-Zertifikat als OpenSSLCertificate-Objekt (ab PHP 8.0) oder als PEM-kodierter String bzw. Dateipfad mit file://-Präfix.
$purpose Pflicht int Der zu prüfende Verwendungszweck als vordefinierte Konstante, z. B. X509_PURPOSE_SSL_CLIENT, X509_PURPOSE_SSL_SERVER, X509_PURPOSE_NS_SSL_SERVER, X509_PURPOSE_SMIME_SIGN, X509_PURPOSE_SMIME_ENCRYPT, X509_PURPOSE_CRL_SIGN oder X509_PURPOSE_ANY.
$ca_info array [] Optionales Array mit vertrauenswürdigen CA-Informationen. Erlaubte Schlüssel: file (Pfad zu einer PEM-Datei mit einem oder mehreren CA-Zertifikaten) und dir (Pfad zu einem Verzeichnis mit Hash-benannten CA-Zertifikaten im OpenSSL-Format).
$untrusted_certificates_file string|null null Optionaler Pfad zu einer PEM-Datei mit Zwischenzertifikaten, die bei der Kettenvalidierung als Hilfszertifikate herangezogen werden, ohne ihnen selbst zu vertrauen.

Rückgabewert

Typ
bool|int
Beschreibung
Gibt true zurück, wenn das Zertifikat für den angegebenen Zweck geeignet ist, false, wenn es nicht geeignet ist, und -1 bei einem internen Fehler (z. B. ungültiger Parameter oder nicht parsebares Zertifikat).

Beispiele

Prüfung ob ein Zertifikat als SSL-Server-Zertifikat geeignet ist

<?php
// Zertifikat aus einer Datei laden
$certData = file_get_contents('/etc/ssl/certs/mein-server.crt');
$cert = openssl_x509_read($certData);

if ($cert === false) {
    die('Zertifikat konnte nicht gelesen werden.');
}

// CA-Bundle angeben
$caInfo = [
    'file' => '/etc/ssl/certs/ca-bundle.crt',
];

$result = openssl_x509_checkpurpose($cert, X509_PURPOSE_SSL_SERVER, $caInfo);

if ($result === true) {
    echo 'Das Zertifikat ist als SSL-Server-Zertifikat geeignet.';
} elseif ($result === false) {
    echo 'Das Zertifikat ist NICHT als SSL-Server-Zertifikat geeignet.';
} else {
    echo 'Fehler bei der Überprüfung des Zertifikats.';
}
Das Zertifikat ist als SSL-Server-Zertifikat geeignet.

Prüfung eines S/MIME-Signierzertifikats mit Zwischenzertifikat

<?php
// Zertifikat direkt als PEM-String übergeben
$pemCert = file_get_contents('/pfad/zum/user-smime.crt');

// Vertrauensanker: Verzeichnis mit Hash-benannten CA-Zertifikaten
$caInfo = [
    'dir' => '/etc/ssl/certs/',
];

// Zwischenzertifikat (wird nicht vertraut, hilft aber bei der Kettenbildung)
$untrustedFile = '/pfad/zum/intermediate.crt';

$result = openssl_x509_checkpurpose(
    $pemCert,
    X509_PURPOSE_SMIME_SIGN,
    $caInfo,
    $untrustedFile
);

switch ($result) {
    case true:
        echo 'Zertifikat darf für S/MIME-Signierung verwendet werden.';
        break;
    case false:
        echo 'Zertifikat ist für S/MIME-Signierung nicht zugelassen.';
        break;
    default:
        echo 'Interner Fehler bei der Zertifikatsprüfung.';
}
Zertifikat darf für S/MIME-Signierung verwendet werden.

// Wichtig · Fallstricke

Rückgabewert genau prüfen: Da die Funktion true, false oder -1 zurückgeben kann, sollte der Vergleich immer mit strikten Operatoren (===) erfolgen. Ein einfaches if ($result) würde bei -1 (Fehlerfall) fälschlicherweise als wahr ausgewertet werden, was zu Sicherheitslücken führen kann.

CA-Bundle: Wird kein ca_info angegeben, verwendet OpenSSL das systemweit konfigurierte Standard-CA-Bundle. In Produktivumgebungen sollte das CA-Bundle explizit angegeben werden, um unerwartetes Verhalten zu vermeiden.

PHP 8.0: Ab PHP 8.0 werden OpenSSL-Ressourcen durch OpenSSLCertificate-Objekte ersetzt. Die Funktion ist abwärtskompatibel und akzeptiert weiterhin PEM-Strings und Dateipfade mit file://-Präfix.