Возникла странная проблема с cURL и PHP на нескольких ящиках CentOS.
Локально я использую CentOS 6.3. Пульт - CentOS 5.9
Локально ящик получает запрос, scp - это файл на удаленный сервер, а затем выполняет запрос cURL через PHP на удаленный сервер, чтобы отправить некоторую информацию. Запрос всегда не выполняется с первой попытки за день. Последующие запросы работают нормально. Remote имеет действующий сертификат SSL - даже в этом случае отключение проверки сертификата и хоста не решает проблему.
Ведение журнала не очень помогло. Если увеличить степень детализации до 11, то наиболее значимыми являются следующие записи:
* About to connect() to www.example.com port 443 (#0)
* Trying 203.0.113.10... * connected
* Connected to www.example.com (203.0.113.10) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* NSS error -5938
* Closing connection #0
* SSL connect error
Погуглить ошибку тоже не очень помогает. Похоже, у твиттера была похожая проблема (https://dev.twitter.com/discussions/1549), который они, по-видимому, исправили, но не уточняли, как это было исправлено.
Любые идеи о том, где искать / что делать, чтобы смягчить проблему, были бы оценены.
это общая проблема для curl, скомпилированного с NSS (только пакеты redhat-linux, debian и suse, скомпилированные без nss). вам нужно скомпилировать curl из исходников без nss-библиотеки.
Итак, у меня нет решения, как https-соединения работали с nss-curl.
curl --version curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl / 7.29.0 NSS / 3.14.3.0 zlib / 1.2.7 libidn / 1.26 libssh2 / 1.4.3 Протоколы: файл dict ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp Функции: AsynchDNS GSS-согласование IDN IPv6 libzb Largefile NTLM NTLM
curl --version curl 7.25.0 (x86_64-suse-linux-gnu) libcurl / 7.25.0 OpenSSL / 1.0.1e zlib / 1.2.7 libidn / 1.25 libssh2 / 1.4.0 Протоколы: файл dict ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp Функции: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
Я столкнулся с аналогичной «ошибкой NSS -5938» при использовании устаревшей системы CentOS 6.x для подключения к встроенному устройству, которое перестало принимать TLS 1.0, разрешая только TLS 1.1 и выше. Решением для меня было сделать yum update
. Я видел, что произошли эти обновления:
---> Package curl.x86_64 0:7.19.7-46.el6 will be updated
---> Package curl.x86_64 0:7.19.7-52.el6 will be an update
...
---> Package nss.x86_64 0:3.21.0-0.3.el6_7 will be updated
---> Package nss.x86_64 0:3.21.3-2.el6_8 will be an update
Я думаю, что это могло быть конкретное изменение, которое помогло:
$ rpm -q --changelog curl
[...]
* Mon Jan 11 2016 Kamil Dudka <kdudka@redhat.com> 7.19.7-50
- use the default min/max TLS version provided by NSS (#1289205)
Сообщение об ошибке NSS 5938 обычно означает, что сервер прервал ваше соединение. Вы должны проверить журналы на стороне сервера для цели curl, чтобы узнать, почему ваше соединение было прервано.
Это может быть что-то простое, например «не удалось получить обратное имя хоста DNS для X».