Làm thế nào để một máy chủ web biết cặp khóa nào được sử dụng để giải mã SSL?


18

Theo hiểu biết của tôi rằng khi Apache nhận được yêu cầu tới một trong các cổng TCP mà nó đang lắng nghe (ví dụ 80, 443), nó sẽ quyết định máy chủ nào đang được yêu cầu bằng cách xem tiêu đề HTTP Host. Sau đó, máy chủ sẽ biết máy chủ ảo nào sẽ chuyển hướng yêu cầu đến.

Nhưng làm thế nào để nó hoạt động cho HTTP qua SSL / TLS? Vì toàn bộ yêu cầu HTTP đang được mã hóa (ít nhất đó là những gì tôi tin rằng tôi đã đọc ở đâu đó), thông tin tiêu đề chỉ có thể được đọc sau khi máy chủ đã giải mã dữ liệu. Nhưng để giải mã, cần biết cặp khóa nào sẽ được sử dụng vì bạn có thể cài đặt nhiều chứng chỉ SSL trên máy chủ web.

Vậy làm thế nào để máy chủ biết khóa nào cần giải mã?


Tôi đoán :

Tôi có thể tưởng tượng rằng cái bắt tay TLS cung cấp thông tin cần thiết.


Về cờ "có thể trùng lặp" :

Mặc dù tôi đồng ý rằng các câu trả lời cho cả câu hỏi được liên kết và câu hỏi của tôi đều giống nhau, tôi phải nói câu hỏi là khác nhau. Không có vấn đề gì về việc có thể lưu trữ nhiều trang web với chứng chỉ SSL độc lập hay không. Thay vào đó câu hỏi của tôi giải quyết các khía cạnh kỹ thuật cơ bản.




Tôi đồng ý rằng các câu trả lời khá giống nhau, tuy nhiên tôi tin rằng các câu hỏi khá khác nhau.
paolo

Câu trả lời:


29

Ban đầu, máy chủ web không biết. Đây là lý do mà bạn cần một địa chỉ IP riêng cho mỗi vhost SSL mà bạn muốn lưu trữ trên máy chủ. Bằng cách này, máy chủ biết rằng khi có kết nối đến trên IP X, anh ta cần sử dụng cấu hình (bao gồm chứng chỉ) cho vhost liên quan.

Điều này đã thay đổi với Chỉ định tên máy chủ , tiện ích mở rộng TLS thực sự cho phép khách hàng chỉ ra tên máy chủ được yêu cầu trong quy trình bắt tay. Tiện ích mở rộng này được sử dụng trong tất cả các hệ điều hành hiện đại, nhưng các trình duyệt hoặc máy chủ cũ không hỗ trợ nó, vì vậy nếu bạn mong muốn khách hàng vẫn sử dụng IE 6 trên WinXP, bạn sẽ không gặp may.


2
Nếu ai đó vẫn sử dụng XP, dù sao họ cũng không xứng đáng truy cập trang web của tôi;)
paolo

2
cần hết sức cẩn thận khi giới hạn khách hàng theo cách này (trình duyệt không phải người). Nhiều, nhiều doanh nghiệp không nâng cấp cửa sổ rất tốt và điều tương tự cũng xảy ra với một số nhà cung cấp điện thoại Android, họ thường không nâng cấp hệ điều hành của họ (hoặc ít nhất là không nhiều). Windows XP ở mức 8% và thị phần Android trước 4.4 có vẻ rất lớn.
coteyr

Trong trường hợp máy chủ thiếu hỗ trợ SNI, có thể sử dụng proxy có hỗ trợ SNI trước máy chủ mà không cần hỗ trợ SNI.
kasperd

1
@coteyr Phần lớn người dùng XP còn lại ở Trung Quốc. Có rất ít sử dụng ở nơi khác, may mắn thay, ít nhất là trên Internet.
Michael Hampton

7

Có vẻ như bạn có một số hiểu lầm về TLS / SSL. Yêu cầu HTTP không được mã hóa bằng khóa chung của máy chủ. Nó được mã hóa bởi một mật mã đối xứng bằng cách sử dụng một khóa được đàm phán trong cái bắt tay trước đó.

Mô tả ngắn gọn về bắt tay TLS: Máy chủ và máy khách đàm phán một số ciphersuite, khóa đối xứng và một số chi tiết khác. Để ngăn MITM, máy chủ thường gửi chứng chỉ (chuỗi) của nó đến máy khách và xác thực bắt tay bằng khóa trong chứng chỉ. (Ngoài ra còn có một số biến thể khác, ví dụ như xác thực ứng dụng khách hoặc TLS-PSK, nhưng chúng không được sử dụng nhiều với HTTP.) Máy khách có thể xác thực chứng chỉ (theo cách thông thường) hoặc bỏ qua nó.

Mặc dù SNI rất quan trọng khi sử dụng nhiều chứng chỉ TLS tại một IP, nhưng không cần thiết cho máy chủ có thể giải mã yêu cầu. Không có SNI, máy chủ không biết nên gửi chuỗi chứng chỉ nào, vì vậy máy chủ thường chọn một chuỗi (ví dụ: vhost đầu tiên), tất nhiên có thể là một chuỗi sai. Nếu máy chủ chọn chuỗi chứng chỉ sai, máy khách sẽ từ chối nó (để nó không tiếp tục gửi yêu cầu HTTP). Tuy nhiên, nếu khách hàng bỏ qua chứng chỉ (hoặc nếu chứng chỉ không hợp lệ được đánh dấu là đáng tin cậy cho trang web này), thì nó có thể tiếp tục thành công. Vì khóa đối xứng được sử dụng để mã hóa không phụ thuộc vào chứng chỉ (TLS được thiết kế để hoạt động mà không cần chứng chỉ), nên máy chủ có thể giải mã nó.

Chỉ là một lưu ý nhỏ tại sao tôi viết về TLS, trong khi bạn hỏi về SSL: TLS là phiên bản mới của SSL. Tất cả các phiên bản SSL được coi là không an toàn cho sử dụng chung, vì vậy chúng tôi chủ yếu sử dụng TLS (1.0, 1.1, 1.2) ngay bây giờ.


"Yêu cầu HTTP không được mã hóa bằng khóa chung của máy chủ. Nó được mã hóa bằng mật mã đối xứng bằng khóa được đàm phán trong lần bắt tay trước." Không biết điều đó, cảm ơn vì đã ngẩng cao đầu! Tuy nhiên, tôi biết rằng TLS đã thay thế SSL, nhưng chúng tôi vẫn mắc kẹt với thuật ngữ "chứng chỉ SSL" thông thường, do đó tôi đã đề cập đến.
paolo

Tôi biết rằng các thuật ngữ như chứng chỉ SSL SSL, khá thường xuyên đối với TLS. Tôi đang cố gắng tránh chúng, nhưng tôi không chắc liệu bạn (hoặc người khác) có biết thuật ngữ TLS hay không.
v6ak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.