2010-12-30 11 views
20

Deseo realizar llamadas AJAX a un servidor seguro que utiliza un certificado autofirmado. En el entorno en el que se utiliza mi aplicación, está bien: puedo proporcionar el certificado CA a los usuarios y hacer que lo instalen antes de usar la aplicación. Sin embargo, a veces, un usuario intenta visitar la aplicación antes de instalar los certs. En estos casos, la aplicación falla silenciosamente, al menos en Firefox (el caso más común del problema), parece que la llamada muere silenciosamente, sin siquiera disparar el controlador de errores. FWIW, si el usuario visita una página real en el servidor, recibe una advertencia de cert.Las llamadas AJAX a HTTPS no confiable (autofirmado) fallan silenciosamente

Podría hackear una solución alternativa, por ejemplo, hacer una solicitud de latido/ping y configurar un temporizador de vigilancia para ver si el servidor responde a tiempo, pero parece, bueno, hacky. Prefiero poder probar la conexión antes de tiempo. ¿Cuál es la forma "correcta" de asegurarse de que el servidor con el que desea hablar tenga un certificado de confianza dentro de Javascript? Si hace alguna diferencia, estoy haciendo mis solicitudes AJAX a través de JQuery.

ACTUALIZACIÓN: Hay una gran frase final aquí. Resulta que AJAX no era el problema en absoluto. Estaba seguro de que estaba basado en los síntomas de que estaba relacionado con los certificados autofirmados, pero la falta de error de AJAX era inquietante, especialmente. dada la especificación vinculada a en la respuesta a continuación. Otro miembro del equipo lo identificó: los manejadores de errores AJAX no se estaban disparando porque JQuery nunca se cargó! Incluimos JQuery de otro subdominio de nuestro sitio, también alojado en HTTPS, y los usuarios agregaron excepciones para ourService.example.com pero no js.example.com. Aparentemente, si señala una etiqueta <script> en una conexión segura no confiable, que falla silenciosamente también.

{/} headdesk

+0

¿El comportamiento que está viendo es diferente de no poder contactar al servidor en absoluto, como cuando su conexión de red desaparece? – martona

Respuesta

14

XMLHttpRequests (peticiones AJAX), sólo se permiten en los servidores del mismo origen. Eso significa que la parte del esquema: // host: puerto de la URL objetivo debe coincidir con la del documento actual. De acuerdo con la especificación, ni siquiera se le debe permitir hacer una solicitud en la URL SSL desde la que no es SSL.

La solución menos hackosa que veo es que simplemente redirige a todos los usuarios al sitio SSL. De esta forma, se verán obligados a ver la advertencia del certificado antes de que se pueda realizar una solicitud de AJAX.

Nota: La especificación también dice que en caso de fallo de handshake TLS (que supongo que este caso cae, en cierto modo) debería lanzar una excepción NETWORK_ERR (código 19). Podría intentar atrapar la excepción cuando inicie la solicitud de AJAX. Consulte the spec sobre el manejo de errores para más detalles.

+2

Has acertado en el primer párrafo y no en el segundo. Ningún navegador permitirá libremente que se realice una solicitud XMLHTTP desde HTTP a HTTPS. Algunos navegadores (por ejemplo, Firefox) tienen un mecanismo de permiso de aceptación (por ejemplo, los encabezados Access-Control-Allow-Origin). IE no tiene tal mecanismo. – EricLaw

+0

Gracias por confirmar, lo he editado. – Seldaek

Cuestiones relacionadas