2013-06-06 11 views
6

Qui ho un programma di esempio che sta tentando di connettersi al server LDAP sulla porta protetta (ldaps: //) Tuttavia, il programma di esempio non è in grado di legarsi al server.Impossibile associare il programma di esempio al server LDAP tramite SSL (ldaps: //)

#define LDAP_DEPRECATED 1 
#include <stdio.h> 
#include <ldap.h> 

#define BIND_DN "dc=example,dc=com" 
#define BIND_PW "secret" 

int main() { 
    LDAP *ld; 
    int rc; 
    int reqcert = LDAP_OPT_X_TLS_NEVER; 
    int version = LDAP_VERSION3; 
    int ret(0); 

    if (ldap_initialize (&ld, "ldaps://192.168.1.51:10636")) { 
     perror("ldap_init"); /* no error here */ 
     return(1); 
    } 

    ldap_set_option (ld, LDAP_OPT_PROTOCOL_VERSION, &version); 
    ldap_set_option (ld, LDAP_OPT_X_TLS_REQUIRE_CERT, &reqcert); 

    rc = ldap_bind_s(ld, BIND_DN, BIND_PW, LDAP_AUTH_SIMPLE); 

    if(rc != LDAP_SUCCESS) 
    { 
     fprintf(stderr, "ldap_simple_bind_s: %s\n", ldap_err2string(rc)); 
     return(1); 
    } 
    printf("Initial Authentication successful\n"); 
    ldap_unbind(ld); 
} 

Tuttavia, con START_TLS il programma di esempio si lega con successo al server LDAP in esecuzione sulla porta 10389. client ldapsearch è in grado di connettersi al server ans cercare l'albero base di utenti. Ma il programma di esempio sopra non lo fa.

Per farlo funzionare con START_TLS: Ecco quello che ho aggiunto:

ldap_set_option (ld, LDAP_OPT_X_TLS_REQUIRE_CERT, &reqcert);  
rc = ldap_start_tls_s(ld, NULL, NULL); 
    if (rc != LDAP_SUCCESS) { 
     printf("ldap_start_tls() %s",ldap_err2string(ret)); 
    } 

Qualcuno può sottolineare che cosa manco qui per il legame a server LDAP tramite LDAPS: // ??

+0

Non ho molta familiarità con C++, ma ho già visto questo stesso errore prima in C# che si occupa di LDAPS. Il modo in cui lo abbiamo risolto restituiva sempre un 'delegate {return true} sull'opzione di sessione' VerifyServerCertificate': 'ldapConnection.SessionOptions.VerifyServerCertificate + = delegate {return true; }; 'Puoi fare qualcosa di simile in C++? – X3074861X

risposta

0

modificare /etc/openldap/ldap.conf, aggiungi la linea:

TLS_REQCERT mai

poi riprovare.

+0

Non è uguale all'impostazione dell'opzione ldap "LDAP_OPT_X_TLS_REQUIRE_CERT" a "LDAP_OPT_X_TLS_NEVER" ?? –

+0

ldap_initialize leggerà il file di configurazione. In teoria, impostare l'opzione dovrebbe funzionare, motivo per essere indagato, ... –

+0

Non ho mai visto questo documentato da nessuna parte. Grazie. Che ne dici di ldap_init() (anche se deprecato, va bene per me) ?? Verrà letto il file di configurazione ?? oppure ldap_set_option() ha la priorità? –

0

Sembra che si stia tentando di impostare una connessione TLS tramite la porta SSL, che non è possibile. Ecco una citazione da wiki page on LDAP:

C'è un analogo non standard simile: schema URL per LDAP su SSL. Ciò non deve essere confuso con LDAP con TLS, che viene ottenuto utilizzando l'operazione StartTLS utilizzando lo schema ldap standard :.

A meno che il tuo programma non debba connettersi ad un server LDAP molto vecchio che non supporta TLS, ma solo SSL, consiglierò di usare sempre TLS. È sicuro almeno quanto SSL.

Tuttavia, se è necessario creare una connessione SSL, credo che this thread on openldap site sarà di aiuto. In breve penso (mi dispiace non ho un ambiente per verificare questo) è necessario utilizzare LDAP_OPT_X_TLS_CACERTFILE anziché LDAP_OPT_X_TLS_REQUIRE_CERT. Inoltre non dovresti chiamare ldap_start_tls_s, perché proverà a stabilire una connessione TLS (che non vuoi).

+0

Non sto cercando di configurare TLS su porta SSL. Sto cercando di configurare SSL la porta dedicata a SSL (porta 10636). Inoltre, non ho un certificato per verificare il server. Quindi, sto impostando "LDAP_OPT_X_TLS_REQUIRE_CERT" su "LDAP_OPT_X_TLS_NEVER" .. Equivalente all'impostazione di TLS_REQCERT su Mai nel file ldap.conf. –

Problemi correlati