Tengo un problema extraño con cURL y PHP en un par de sistemas CentOS.
Localmente, estoy ejecutando CentOS 6.3. El control remoto es CentOS 5.9
Localmente, la caja recibe una solicitud, un archivo scp al servidor remoto, luego realiza una solicitud cURL a través de PHP al servidor remoto para enviar información. La solicitud siempre falla en el primer intento del día. Las solicitudes posteriores funcionan bien. Remote tiene un certificado SSL válido; aun así, desactivar el certificado y la verificación del host no soluciona el problema.
El registro no ha sido de mucha ayuda. Subiendo la verbosidad a 11, las entradas más significativas son las siguientes:
* 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
Buscar el error en Google tampoco ayuda mucho. Parece que Twitter estaba teniendo un problema similar (https://dev.twitter.com/discussions/1549) que aparentemente arreglaron, pero no dieron más detalles sobre cómo se solucionó.
Se agradecería cualquier idea sobre dónde buscar/qué hacer para mitigar el problema.
Respuesta1
Es un problema general para curl compilado con NSS (solo paquetes redhat-linuxes, debian y suse curl compilados sin nss). necesita compilar curl de fuentes sin nss-library.
Entonces, no tengo una solución a cómo funcionaron las conexiones https con nss-curl.
curl --versión curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 NSS/3.14.3.0zlib/1.2.7 libidn/1.26 libssh2/1.4.3 Protocolos: archivo dict ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp Características: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz
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 Protocolos: archivo dict ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp Características: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
Respuesta2
Encontré un "error NSS -5938" similar cuando usaba un sistema CentOS 6.x obsoleto para conectarme a un dispositivo integrado que dejó de aceptar TLS 1.0 y solo permitía TLS 1.1 y superior. La solución para mí fue hacer un yum update
. Vi que ocurrieron estas actualizaciones:
---> 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
Creo que este podría ser el cambio específico que ayudó:
$ rpm -q --changelog curl
[...]
* Mon Jan 11 2016 Kamil Dudka <[email protected]> 7.19.7-50
- use the default min/max TLS version provided by NSS (#1289205)
Respuesta3
El mensaje de error NSS 5938 generalmente significa que el servidor cortó su conexión. Debe verificar los registros del lado del servidor del objetivo de curl para ver por qué se cortó su conexión.
Podría ser algo tan simple como "no se pudo obtener un nombre de host DNS inverso para X".