2010-12-30 33 views
20

Tôi muốn thực hiện cuộc gọi AJAX đến máy chủ bảo mật sử dụng chứng chỉ tự ký. Trong môi trường mà ứng dụng của tôi đang được sử dụng, điều này là tốt - tôi có thể cung cấp chứng chỉ CA cho người dùng và yêu cầu họ cài đặt ứng dụng đó trước khi sử dụng ứng dụng. Tuy nhiên, đôi khi, người dùng cố truy cập ứng dụng trước khi cài đặt chứng chỉ. Trong những trường hợp này, ứng dụng âm thầm không thành công - ít nhất là trong Firefox (trường hợp phổ biến nhất của sự cố), có vẻ như cuộc gọi âm thầm chết, thậm chí không cần tắt trình xử lý lỗi. FWIW, nếu người dùng truy cập vào trang thực tế trên máy chủ, họ sẽ nhận được cảnh báo cert.Cuộc gọi AJAX tới HTTPS không tin cậy (tự ký) không thành công

Tôi có thể hack trong một cách giải quyết - hãy thực hiện yêu cầu nhịp tim/ping và thiết lập bộ đếm thời gian để xem máy chủ có phản hồi kịp thời không - nhưng điều đó có vẻ, tốt, hacky. Tôi muốn có thể kiểm tra kết nối trước thời hạn. Cách "đúng" để đảm bảo máy chủ bạn muốn nói chuyện có chứng chỉ đáng tin cậy từ bên trong Javascript là gì? Nếu nó làm cho bất kỳ sự khác biệt, tôi đang làm yêu cầu AJAX của tôi thông qua JQuery.

CẬP NHẬT: Có một cú đấm tuyệt vời ở đây. Hóa ra, AJAX không phải là vấn đề. Tôi đã chắc chắn dựa trên các triệu chứng mà nó liên quan đến các chứng chỉ tự ký, nhưng việc thiếu lỗi AJAX là đáng lo ngại, đặc biệt. đưa ra thông số được liên kết trong câu trả lời dưới đây. Một thành viên khác của nhóm đã đóng đinh: trình xử lý lỗi AJAX không được kích hoạt vì JQuery chưa bao giờ được tải! Chúng tôi đã bao gồm JQuery từ một tên miền phụ khác của trang web của chúng tôi, cũng được lưu trữ trên HTTPS - và người dùng đã thêm ngoại lệ choService.example.com của chúng tôi chứ không phải js.example.com. Dường như nếu bạn trỏ một thẻ <script> vào kết nối an toàn không đáng tin cậy, thì cũng không tự động xóa.

{/ headdesk}

+0

Hành vi bạn nhìn thấy khác với việc không thể liên lạc với máy chủ chút nào, chẳng hạn như khi kết nối mạng của bạn biến mất? – martona

Trả lời

14

XMLHttpRequests (yêu cầu AJAX) chỉ được phép trên cùng một máy chủ gốc. Điều đó có nghĩa là lược đồ: // host: phần cổng của URL mục tiêu phải khớp với phần của tài liệu hiện tại. Theo thông số kỹ thuật, bạn thậm chí không được phép thực hiện yêu cầu trên URL SSL từ URL không phải SSL.

Giải pháp ít bị tấn công mà tôi thấy là bạn chỉ cần chuyển hướng tất cả người dùng đến trang web SSL. Bằng cách đó, họ sẽ bị buộc phải xem cảnh báo chứng chỉ trước khi có bất kỳ yêu cầu AJAX nào có thể được thực hiện.

Lưu ý: Thông số kỹ thuật cũng cho biết trong trường hợp lỗi bắt tay TLS (mà tôi giả định trường hợp này thuộc, theo một cách), nó sẽ ném ngoại lệ NETWORK_ERR (mã 19). Bạn có thể cố gắng nắm bắt ngoại lệ khi bắt đầu yêu cầu AJAX. Tham khảo the spec về xử lý lỗi để biết thêm chi tiết.

+2

Bạn đã đúng trong đoạn đầu tiên và không phải trong đoạn thứ hai. Không trình duyệt nào sẽ tự do cho phép XMLHTTPRequest được thực hiện từ HTTP sang HTTPS. Một số trình duyệt (ví dụ: Firefox) có cơ chế cho phép chọn tham gia (ví dụ: các tiêu đề Access-Control-Allow-Origin). IE không có cơ chế như vậy. – EricLaw

+0

Cảm ơn bạn đã xác nhận, tôi đã chỉnh sửa nó đi. – Seldaek

Các vấn đề liên quan