Start · Sprachen · PHP · Referenz · ldap_connect_wallet

ldap_connect_wallet

Funktion

Stellt eine Verbindung zu einem LDAP-Server her und verwendet dabei ein Oracle Wallet zur Authentifizierung (SSL/TLS).

seit PHP 8.2.0 Kategorie: misc

Signatur

ldap_connect_wallet(string $uri, string $wallet, string $password, int $auth_mode = GSLC_SSL_NO_AUTH): LDAP\Connection|false

Beschreibung

ldap_connect_wallet() ist eine erweiterte Variante von ldap_connect(), die speziell für den Einsatz mit Oracle Wallets konzipiert wurde. Ein Oracle Wallet ist ein verschlüsselter Speicher für Sicherheitszertifikate, private Schlüssel und vertrauenswürdige Zertifizierungsstellen (CAs), der häufig in Oracle-Umgebungen sowie in Verbindung mit dem Oracle Instant Client verwendet wird.

Diese Funktion wird typischerweise eingesetzt, wenn eine LDAP-Verbindung über LDAPS (LDAP über SSL/TLS) aufgebaut werden soll und die erforderlichen Zertifikate in einem Wallet-Verzeichnis vorliegen, anstatt in einer herkömmlichen PEM/DER-Datei. Der $auth_mode-Parameter steuert, ob und wie die Client-Authentifizierung per Zertifikat erfolgt.

Die Funktion ist nur verfügbar, wenn PHP mit Oracle-LDAP-Unterstützung (OCI8 + Oracle Instant Client mit LDAP-Bibliotheken) kompiliert wurde. In Standard-Installationen steht sie daher möglicherweise nicht zur Verfügung.

Nach erfolgreicher Verbindung kann die zurückgegebene LDAP\Connection-Ressource wie bei einer normalen LDAP-Verbindung mit ldap_bind(), ldap_search() usw. weiterverwendet werden.

Parameter

Name Typ Default Beschreibung
$uri Pflicht string Die LDAP-URI des Zielservers, z. B. ldaps://ldap.example.com:636. Es sollte eine ldaps://-URI verwendet werden, da das Wallet primär für verschlüsselte Verbindungen gedacht ist.
$wallet Pflicht string Pfad zum Oracle Wallet-Verzeichnis, das die benötigten Zertifikate und Schlüssel enthält, z. B. /etc/oracle/wallet. Das Verzeichnis muss die Dateien cwallet.sso oder ewallet.p12 enthalten.
$password Pflicht string Das Passwort zum Entsperren des Wallets. Bei einem Auto-Login-Wallet (cwallet.sso) kann ein leerer String übergeben werden.
$auth_mode int GSLC_SSL_NO_AUTH Authentifizierungsmodus für die SSL-Verbindung. Mögliche Werte sind die GSLC_SSL_*-Konstanten: GSLC_SSL_NO_AUTH (kein Client-Zertifikat), GSLC_SSL_ONEWAY_AUTH (Server-Authentifizierung) oder GSLC_SSL_TWOWAY_AUTH (gegenseitige Authentifizierung).

Rückgabewert

Typ
LDAP\Connection|false
Beschreibung
Gibt bei Erfolg ein LDAP\Connection-Objekt zurück, das für weitere LDAP-Operationen verwendet werden kann. Im Fehlerfall wird false zurückgegeben, z. B. wenn der Wallet-Pfad ungültig ist, das Passwort nicht stimmt oder die Verbindung zum Server nicht hergestellt werden konnte.

Beispiele

Einfache LDAPS-Verbindung mit Auto-Login-Wallet

<?php
// Verbindung mit einem Oracle Auto-Login-Wallet (kein Passwort erforderlich)
$ldap = ldap_connect_wallet(
    'ldaps://ldap.example.com:636',
    '/etc/oracle/wallet',
    '',
    GSLC_SSL_ONEWAY_AUTH
);

if ($ldap === false) {
    die('Verbindung zum LDAP-Server fehlgeschlagen.');
}

// Anonymes Bind
if (!ldap_bind($ldap)) {
    die('LDAP-Bind fehlgeschlagen: ' . ldap_error($ldap));
}

echo 'Verbindung erfolgreich hergestellt.' . PHP_EOL;

// Einfache Suchanfrage
$result = ldap_search($ldap, 'dc=example,dc=com', '(uid=jdoe)');
$entries = ldap_get_entries($ldap, $result);
print_r($entries);

ldap_unbind($ldap);
Verbindung erfolgreich hergestellt.

Gegenseitige TLS-Authentifizierung (Two-Way) mit verschlüsseltem Wallet

<?php
// Beide Seiten authentifizieren sich mit Zertifikaten
$walletPath = '/var/secure/oracle_wallet';
$walletPassword = getenv('LDAP_WALLET_PASS'); // Passwort aus Umgebungsvariable lesen

$ldap = ldap_connect_wallet(
    'ldaps://secure-ldap.example.com:636',
    $walletPath,
    $walletPassword,
    GSLC_SSL_TWOWAY_AUTH
);

if ($ldap === false) {
    throw new RuntimeException('LDAP Wallet-Verbindung konnte nicht aufgebaut werden.');
}

// Protokollversion setzen
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);

// Authentifiziertes Bind mit Dienstkonto
$bindDn = 'cn=service-account,ou=users,dc=example,dc=com';
$bindPass = getenv('LDAP_BIND_PASS');

if (!ldap_bind($ldap, $bindDn, $bindPass)) {
    throw new RuntimeException('LDAP-Bind fehlgeschlagen: ' . ldap_error($ldap));
}

echo 'Sichere LDAP-Verbindung mit gegenseitiger Authentifizierung aktiv.' . PHP_EOL;

ldap_unbind($ldap);
Sichere LDAP-Verbindung mit gegenseitiger Authentifizierung aktiv.

// Wichtig · Fallstricke

Plattform- und Build-Abhängigkeit: ldap_connect_wallet() ist nur verfügbar, wenn PHP mit Oracle LDAP-Unterstützung (Oracle Instant Client und entsprechende LDAP-Bibliotheken) gebaut wurde. Auf Standard-Linux/Windows-Paketen ist die Funktion in der Regel nicht vorhanden.

Sicherheit: Speichern Sie Wallet-Passwörter niemals im Quellcode. Verwenden Sie stattdessen Umgebungsvariablen, Secrets-Manager oder gesicherte Konfigurationsdateien mit restriktiven Dateisystemberechtigungen. Bevorzugen Sie nach Möglichkeit Auto-Login-Wallets (cwallet.sso), um Passwörter im Code ganz zu vermeiden.

Fehlerbehandlung: Die Funktion gibt bei Verbindungsfehlern false zurück, wirft aber keine Exception. Prüfen Sie den Rückgabewert immer explizit und verwenden Sie ldap_error() zur Diagnose.

Wallet-Format: Unterstützt werden Oracle-Wallet-Verzeichnisse, die mit dem Oracle Wallet Manager oder orapki erstellt wurden. Standard-PEM/DER-Zertifikate werden mit dieser Funktion nicht direkt genutzt; für diese sollte ldap_connect() in Kombination mit ldap_set_option() und LDAP_OPT_X_TLS_* verwendet werden.