2010-12-21 12 views
5

Después de buscar por todas partes, no puedo entender por qué las solicitudes cURL emitidas a un host remoto habilitado para SSL tienen éxito solo el 50% del tiempo en mi caso. Esta es la situación: tengo una secuencia de solicitudes CURL, todas emitidas para un host remoto HTTPS, dentro de un único script PHP que ejecuto usando la CLI de PHP. De vez en cuando al ejecutar el script de las peticiones se ejecutan con éxito, pero por alguna razón la mayoría de las veces que lo dirige me sale el siguiente error de CURL:La solicitud cURL/PHP ejecuta el 50% del tiempo

* About to connect() to www.virginia.edu port 443 (#0) 
* Trying 128.143.22.36... * connected 
* Connected to www.virginia.edu (128.143.22.36) port 443 (#0) 
* successfully set certificate verify locations: 
* CAfile: none 
    CApath: /etc/ssl/certs 
* error:140943FC:SSL routines:SSL3_READ_BYTES:sslv3 alert bad record mac 
* Closing connection #0 

Si lo intento de nuevo un par de veces me sale el mismo resultado, pero luego de unos pocos intentos las solicitudes se llevarán a cabo con éxito. Ejecutar el script después de eso nuevamente genera un error y el patrón continúa. Investigar el error 'alert bad macr record' no me sirvió de nada, y dudo en culparlo de un problema de SSL ya que el script aún se ejecuta ocasionalmente.

Estoy en Ubuntu Server 10.04, con php5 y php5-curl instalados, así como la última versión de openssl. En términos de opciones específicas de cURL, CURLOPT_SSL_VERIFYPEER se establece en falso, y tanto CURLOPT_TIMEOUT como CURLOPT_CONNECTTIMEOUT se establecen en 4 segundos. Un ejemplo más de este problema es el hecho de que la misma situación exacta ocurre en mi máquina de desarrollo Mac OS X - las solicitudes solo pasan ~ 50% del tiempo.

+0

Es posible que desee buscar en Google "Error 140943FC" –

+0

créanme, lo hice. Incluso revisé para asegurarme de que estaba ejecutando Apache en prefork MPM a diferencia de los subprocesos de trabajo ya que aparentemente hay un error relacionado con esto causado por la versión de los hilos de trabajo (ya estoy ejecutando prefork así que no ayudó). – mquinn

+2

Mala grabación MAC no se refiere a la dirección MAC de la interfaz de red. Se refiere a un problema con el "Código de autenticación de mensajes" –

Respuesta

3

El host remoto quizás no sea un host único. Tal vez es una especie de solución de equilibrio de carga con varios servidores que toman las solicitudes entrantes. Lo que me hace pensar que podría ser que es el 'error mac' en el mensaje de error. Esto podría significar que la dirección MAC del host remoto se modificó mientras la negociación de SSL aún se estaba ejecutando. Y esto podría explicar que a veces no tengas ningún problema.

Pero tal vez no :-) Los problemas de SSL son bastante difíciles de encontrar.

No entiendo tu respuesta sobre prefork MPM vs Worker MPM, si ejecutas PHP en modo cli, tu apache MPM no se usa, ni siquiera estás usando apache.

+0

buen punto, un host remoto con equilibrio de carga tendría sentido en mi situación. para abordar eso, decidí simplemente bloquear hasta que pueda obtener una respuesta válida, no falsa de rizo e ir desde allí. lo mejor que tengo por ahora. – mquinn

+3

No creo que MAC tenga nada que ver con una dirección MAC de red. Significa código de autenticación de mensaje: http://en.wikipedia.org/wiki/Message_authentication_code ... esto me lleva a la conclusión de que el cambio de "dirección MAC de host remoto" no tiene nada que ver con este problema y viceversa. –

+0

@Charles Oliver Nutter, pero creo que esto todavía puede ser un problema con algo que debería compartirse entre los hosts (¿caché ssl?) Y cuál no. – regilero

1

Es posible que necesite esta opción:

CURLOPT_FORBID_REUSE

Pasar mucho. Establézcalo en 1 para hacer que la próxima transferencia cierre explícitamente la conexión cuando termine. Normalmente, libcurl mantiene todas las conexiones activas cuando se hace con una transferencia en caso de que se siga una que pueda reutilizarlas. Esta opción debe usarse con precaución y solo si comprende lo que hace. Establézcalo en 0 para que libcurl mantenga la conexión abierta para una posible reutilización posterior (comportamiento predeterminado).

+0

Gracias por la sugerencia, pero fue en vano. Anteriormente había intentado CURLOPT_FRESH_CONNECT, pero no funcionó, y FORBID_REUSE dio como resultado el mismo comportamiento antiguo. – mquinn

0

¿Lo intentó? curl_setopt ($ handle, CURLOPT_SSLVERSION, 3);

Cuestiones relacionadas