NTLM con return cURL 401

Obiettivo : connettersi a un server di Exchange (EWS)
Metodo : cURL
Problema : Imansible get l'authentication (NTLM), richieste di return 401. 1

Sembra che ci sia un vecchio e ben documentato 2 problema che è iniziato con la mossa di cURL da OpenSSL a NSS. Ho letto che l'implementazione di NTLM dipende da OpenSSL e quindi questo movimento ha interrotto l'authentication NTLM.

  • Le impostazioni del server di Outlook 2011 standard continuano a cambiare
  • Come ridurre la dimensione dell'image del disco virtuale KVM
  • Può cambiare la tty per migliorare la velocità di compilazione?
  • Utilizzo di buffer di RAM molto elevati dopo l'istanza di ridimensionamento / riavvio
  • Quante selezioni al secondo possono eseguire un server mysql?
  • Qual è il modo migliore per rendere l'HTML grezzo e printingrlo (a una printingnte) dalla row di command?
  • Il problema è mostrato di seguito, ma le parti importnti sembrano essere il 401 restituito e il gss_init_sec_context() sottostante.

    La cosa che non capisco è che la mia versione attuale:

    • Ha una variante OpenSSL secondo https://launchpad.net/ubuntu/+source/curl/7.22.0-3ubuntu4
    • support NTLM secondo lo stesso collegamento
    • In realtà utilizza questa variante (e non il NSS) secondo il registro seguente (si dice libcurl/7.22.0 OpenSSL )
    • Non dovrebbe essere disturbato da bug collegato come sopra i punti sopra.
    • ma è influenzato, come dimostra il fatto che ho il 401

    Non sono sicuro di come questo possa essere risolto. Ho trovato un sacco di riferimenti vecchi (soprattutto 2010) a questo problema, ma niente di nuovo e certamente niente con una solluzione. So che i riferimenti forniti (vedere 2 ) mostrano che questo potrebbe funzionare con una versione precedente (7.19), ma non posso (né desiderio) di downgrade a quella versione.

    Diverse implementazioni della comunicazione di Exchange (EWS) usano la cURL per recuperare i file EWS (wsdl etc), quindi sono sicuro che esista un metodo di lavoro ma non lo trovo. Qualcuno ha un indizio di cosa posso fare? Ho un altro errore, sto interpretando erroneamente i fatti e questa è ancora la stessa situazione fornita nei link e non verrà mai risolta?


    1 L'errore va in questo modo:

     curl https://*DOMAIN*/Exchange.asmx -w %{http_code} --ntlm -u *USERNAME* --verbose --show-error Enter host password for user '*USERNAME': * About to connect() to DOMAIN port 443 (#0) * Trying IP... connected * successfully set certificate verify locations: * CAfile: none CApath: /etc/ssl/certs * SSLv3, TLS handshake, Client hello (1): * SSLv3, TLS handshake, Server hello (2): * SSLv3, TLS handshake, CERT (11): * SSLv3, TLS handshake, Server finished (14): * SSLv3, TLS handshake, Client key exchange (16): * SSLv3, TLS change cipher, Client hello (1): * SSLv3, TLS handshake, Finished (20): * SSLv3, TLS change cipher, Client hello (1): * SSLv3, TLS handshake, Finished (20): * SSL connection using AES128-SHA * Server certificate: *SNIP* * SSL certificate verify ok. * Server auth using NTLM with user 'USERNAME' > GET /EWS/Exchange.asmx HTTP/1.1 > Authorization: NTLM *snip* > User-Agent: curl/7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 > Host: DOMAIN > Accept: */* > < HTTP/1.1 401 Unauthorized < Server: Microsoft-IIS/7.5 < Set-Cookie: exchangecookie=xxx; expires=Wed, 17-Jul-2013 07:45:30 GMT; path=/; HttpOnly < WWW-Authenticate: NTLM *SNIP* * gss_init_sec_context() failed: : Credentials cache file '/tmp/krb5cc_1005' not foundWWW-Authenticate: Negotiate < X-Powered-By: ASP.NET < Date: Tue, 17 Jul 2012 07:45:30 GMT < Content-Length: 0 < * Connection #0 to host DOMAIN left intact * Closing connection #0 * SSLv3, TLS alert, Client hello (1): 

    2 ad esempio:

    • https://bugs.launchpad.net/ubuntu/+source/curl/+bug/675974
    • https://bugzilla.redhat.com/show_bug.cgi?id=603783
    • https://stackoverflow.com/questions/4341368/curl-always-returns-401-with-ntlm
      • Questo è lo stesso problema, ma non affronta il fatto che il problema NSS non dovrebbe essere presente nel mio libcurl OpenSSL .

    curl info:

     user@server:~$ curl -V curl 7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 Protocols: dict file ftp ftps gopher http https imap imaps ldap pop3 pop3s rtmp rtsp smtp smtps telnet tftp Features: GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP 

  • nginx loggin $ request_body produce una strana codifica
  • Come aggiornare il pacchetto CA di cURL su RedHat?
  • Curl con certificato personalizzato
  • Errore di verifica SSL con git (su github) su Ubuntu 14.04
  • LetsEncrypt: errore di protocollo SSL sconosciuto in connessione
  • Modo più veloce per pingare l'URL di curl
  • 2 Solutions collect form web for “NTLM con return cURL 401”

    Non sono certo per quale motivo, ma mentre la mia versione 7.22 non dovrebbe essere influenzata dall'intera NTLM, sembra che lo sia.

    L'unica soluzione sembra essere quella di utilizzare una vecchia versione (<7.19, ho provato con 7.15) o utilizzare una nuova versione (ho provato 7.26). Come detto, non posso scendere o aggiornare libcurl stesso solo per questa funzionalità. Ciò significa che dobbiamo trovare una soluzione alternativa ….

    Soluzione alternativa utilizzata (avviso: arrivo di hack)

    1. Scaricare e compilare il curl che si desidera utilizzare. Non ho fatto questo come root // sudo questo perché non voglio sostituire il libcurl corrente etc!

       wget http://curl.haxx.se/download/curl-7.26.0.zip ./configure --prefix=/local_path/ make make install 
    2. Prova il nuovo command curl abbiamo appena compilato: dà il 401, ma invece al gss_init_sec_context() dovresti vederlo andare a (alla fine) 302. Questo è vincente.

    3. La parte hack: usa questo libcurl quando chiama lo script. Stiamo lavorando con un'app "PHP" di terze parti (uno dei motivi per cui non sono felice di cambiare tutti i libs di curl) e invece di chiamarlo direttamente, facciamo un wrapper brutto ma funzionante, che chiama qualcosa di simile :

       $se = shell_exec("LD_LIBRARY_PATH=/local_path/lib php /path/3rdparty.php"); 

    Sì, questo ha degli svantaggi, e sì questo è un po 'di un esempio di scheletro (significa che probabilmente vuoi aggiungere alcune cose come forse il path originale per esempio) ma le basi sono un po' lì.

    Non sono davvero orgogliosi di questo, ma penso che più persone siano trattenute dal fatto che non possono solo andare a aggiornare il loro libcurl a una versione random e stanno utilizzando una sorta di plugin che utilizza, ad esempio, php-ews o qualsiasi cosa build sul NTLMSoapClient .

    Spero che ci sia un'altra opzione in giro, ma poiché questo è attualmente l'unico modo per farlo funzionare, ho pensato di condividere.

    Per tutti gli utenti di Centos / RHEL 6.X dare un'occhiata a:

    https://bugzilla.redhat.com/show_bug.cgi?id=953864

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.