Мне нужен мой PHP-скрипт CLI, чтобы опубликовать какое-то значение на сайте, прошедшем проверку подлинности SPNEGO.
$ch = curl_init(USERSPACE_MYSQL_SERVICES); curl_setopt_array($ch, [ CURLOPT_HTTPAUTH => ??, //Set to SPNEGO CURLOPT_POSTFIELDS => [...] ]);
Однако SPNEGO отключен по какой-либо причине:
Выдержка из моего phpinfo:
curl cURL support => enabled cURL Information => 7.21.6 Age => 3 Features AsynchDNS => No Debug => No GSS-Negotiate => Yes IDN => Yes IPv6 => Yes Largefile => Yes NTLM => Yes SPNEGO => No <--------------- SSL => Yes SSPI => No krb4 => No libz => Yes CharConv => No Protocols => dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, pop3, pop3s, rtmp, rtsp, smtp, smtps, telnet, tftp Host => x86_64-pc-linux-gnu SSL Version => OpenSSL/1.0.0e ZLib Version => 1.2.3.4
Сервер Apache, с которым он взаимодействует, настроен следующим образом:
AuthType Kerberos AuthName "Kerberos LAN Realm Login" KrbAuthRealm LAN Krb5KeyTab /etc/apache2/auth/apache2.keytab KrbMethodK5Passwd Off KrbSaveCredentials On KrbLocalUserMapping On
Когда вы пытаетесь выполнить его через curl
командной строки, он работает, но я должен ввести фиктивный пароль:
curl --negotiate -u user https://example.com Enter host password for user 'user': <html> ...
Как включить SPNEGO для curl php и как я буду использовать его в своем скрипте?
Я пробовал следующее:
curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPAUTH => CURLAUTH_ANY, CURLOPT_POSTFIELDS => [...] ]); $response = curl_exec($ch); $info = curl_getinfo($ch); if ($info['http_code'] >= 400) die("HTTP ERROR {$info['http_code']}"); echo $response;
И я получаю: HTTP ERROR 401
Похоже, вам может понадобиться перекомпилировать завиток с аргументом «–with-spnego» в вашей команде configure.
Пример команды configure: http://curl.haxx.se/mail/lib-2012-02/0094.html
Полный на docs (overkill): http://curl.haxx.se/docs/install.html
Оказывается, мне не нужен SPNEGO с CURL, так как он отлично работает с GSS auth. Как и в случае с CLI, мне нужно установить CURLOPT_USERPWD
без предоставления пароля:
$username = rtrim(`id -un`, "\n"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPAUTH => CURLAUTH_ANY, CURLOPT_POSTFIELDS => [...], CURLOPT_USERPWD => "$username:" ]);
Теперь все работает отлично.