SSL thực sự hoạt động như thế nào?


143

SSL hoạt động như thế nào?

Chứng chỉ được cài đặt ở đâu trên máy khách (hoặc trình duyệt?) Và máy chủ (hoặc máy chủ web?)?

Quá trình tin cậy / mã hóa / xác thực bắt đầu như thế nào khi bạn nhập URL vào trình duyệt và lấy trang từ máy chủ?

Làm thế nào để giao thức HTTPS nhận ra chứng chỉ? Tại sao HTTP không thể hoạt động với chứng chỉ khi đó là chứng chỉ thực hiện tất cả công việc tin cậy / mã hóa / xác thực?


24
Tôi nghĩ rằng đây là một câu hỏi hợp lý - hiểu cách SSL hoạt động là bước 1, thực hiện chính xác là bước 2 đến bước vô hạn.
tổng



5
@StingyJack Đừng là một nazi chính sách ở đây. Mọi người đến tìm sự giúp đỡ. Đừng từ chối tất cả sự trợ giúp vì bạn thấy câu hỏi không hoàn toàn phù hợp với quy tắc.
Koray Tugay

1
@KorayTugay - không ai từ chối hỗ trợ. Điều này không thuộc về Security hoặc Sysadmin, nơi nó được nhắm mục tiêu tốt hơn, nhưng OP thường sẽ có lợi trong diễn đàn này bằng cách thêm một chút bối cảnh lập trình thay vì đăng một câu hỏi CNTT chung. Có bao nhiêu người nhận được câu hỏi đóng cửa khi họ không bị ràng buộc với một vấn đề lập trình cụ thể? Có lẽ là quá nhiều, do đó OP của tôi làm nũng để tạo ra sự liên kết đó.
StingyJack

Câu trả lời:


144

Lưu ý: Tôi đã viết câu trả lời ban đầu của mình rất vội vàng, nhưng kể từ đó, nó đã biến thành một câu hỏi / câu trả lời khá phổ biến, vì vậy tôi đã mở rộng nó một chút và làm cho nó chính xác hơn.

Khả năng của TLS

"SSL" là tên thường được sử dụng để chỉ giao thức này, nhưng SSL đặc biệt đề cập đến giao thức độc quyền được thiết kế bởi Netscape vào giữa những năm 90. "TLS" là một tiêu chuẩn IETF dựa trên SSL, vì vậy tôi sẽ sử dụng TLS trong câu trả lời của mình. Ngày nay, tỷ lệ cược là gần như tất cả các kết nối an toàn của bạn trên web thực sự sử dụng TLS, không phải SSL.

TLS có một số khả năng:

  1. Mã hóa dữ liệu lớp ứng dụng của bạn. (Trong trường hợp của bạn, giao thức lớp ứng dụng là HTTP.)
  2. Xác thực máy chủ cho khách hàng.
  3. Xác thực ứng dụng khách đến máy chủ.

# 1 và # 2 là rất phổ biến. # 3 là ít phổ biến hơn. Bạn dường như đang tập trung vào # 2, vì vậy tôi sẽ giải thích phần đó.

Xác thực

Một máy chủ tự xác thực cho khách hàng bằng chứng chỉ. Chứng chỉ là một kho dữ liệu [1] chứa thông tin về trang web:

  • Tên miền
  • Khóa công khai
  • Công ty sở hữu nó
  • Khi nó được ban hành
  • Khi nó hết hạn
  • Ai đã ban hành nó
  • Vân vân.

Bạn có thể đạt được tính bảo mật (số 1 ở trên) bằng cách sử dụng khóa chung có trong chứng chỉ để mã hóa các tin nhắn chỉ có thể được giải mã bằng khóa riêng tương ứng, được lưu trữ an toàn trên máy chủ đó. [2] Hãy gọi cặp khóa này là KP1, để sau này chúng ta sẽ không bị lẫn lộn. Bạn cũng có thể xác minh rằng tên miền trên chứng chỉ phù hợp với trang web bạn đang truy cập (# 2 ở trên).

Nhưng điều gì sẽ xảy ra nếu một đối thủ có thể sửa đổi các gói được gửi đến và từ máy chủ, và nếu đối thủ đó sửa đổi chứng chỉ mà bạn được trình bày và chèn khóa công khai của riêng họ hoặc thay đổi bất kỳ chi tiết quan trọng nào khác thì sao? Nếu điều đó xảy ra, đối thủ có thể chặn và sửa đổi bất kỳ tin nhắn nào bạn nghĩ đã được mã hóa an toàn.

Để ngăn chặn cuộc tấn công này, chứng chỉ được ký mã hóa bằng khóa riêng của người khác theo cách mà chữ ký có thể được xác minh bởi bất kỳ ai có khóa chung tương ứng. Hãy gọi cặp khóa này là KP2, để làm rõ rằng đây không phải là các khóa giống nhau mà máy chủ đang sử dụng.

Cơ quan cấp chứng chỉ

Vậy ai đã tạo ra KP2? Ai đã ký giấy chứng nhận?

Đơn giản hóa một chút, một cơ quan chứng nhận tạo KP2 và họ bán dịch vụ sử dụng khóa riêng của họ để ký chứng chỉ cho các tổ chức khác. Ví dụ: tôi tạo chứng chỉ và tôi trả cho một công ty như Verisign để ký bằng khóa riêng của họ. [3] Vì không ai ngoài Verisign có quyền truy cập vào khóa riêng này, không ai trong chúng tôi có thể giả mạo chữ ký này.

Và cá nhân tôi sẽ nhận được khóa công khai trong KP2 như thế nào để xác minh chữ ký đó?

Vâng, chúng ta đã thấy rằng một chứng chỉ có thể giữ khóa công khai - và các nhà khoa học máy tính thích đệ quy - vậy tại sao không đặt khóa công khai KP2 vào một chứng chỉ và phân phối theo cách đó? Điều này thoạt nghe có vẻ hơi điên rồ, nhưng thực tế đó chính xác là cách nó hoạt động. Tiếp tục với ví dụ Verisign, Verisign tạo ra một chứng chỉ bao gồm thông tin về họ là ai, loại điều họ được phép ký (các chứng chỉ khác) và khóa chung của họ.

Bây giờ nếu tôi có một bản sao của chứng chỉ Verisign đó, tôi có thể sử dụng nó để xác thực chữ ký trên chứng chỉ máy chủ cho trang web tôi muốn truy cập. Dễ thôi phải không?!

Chà, không nhanh như vậy. Tôi phải lấy chứng chỉ Verisign từ đâu đó . Điều gì xảy ra nếu ai đó giả mạo chứng chỉ Verisign và đặt khóa công khai của riêng họ vào đó? Sau đó, họ có thể giả mạo chữ ký trên chứng chỉ của máy chủ và chúng tôi quay lại ngay nơi chúng tôi bắt đầu: một cuộc tấn công trung gian.

Chuỗi chứng chỉ

Tiếp tục suy nghĩ đệ quy, tất nhiên chúng tôi có thể giới thiệu chứng chỉ thứ ba và cặp khóa thứ ba (KP3) và sử dụng chứng chỉ đó để ký chứng nhận Verisign. Chúng tôi gọi đây là chuỗi chứng chỉ: mỗi chứng chỉ trong chuỗi được sử dụng để xác minh chứng chỉ tiếp theo. Hy vọng rằng bạn có thể thấy rằng phương pháp đệ quy này chỉ là rùa / chứng chỉ. Nó dừng ở đâu?

Vì chúng tôi không thể tạo số lượng chứng chỉ vô hạn, chuỗi chứng chỉ rõ ràng phải dừng ở đâu đó và điều đó được thực hiện bằng cách bao gồm chứng chỉ trong chuỗi tự ký .

Tôi sẽ dừng lại một chút trong khi bạn nhặt những mảnh vật chất từ ​​đầu phát nổ. Tự ký?!

Có, ở cuối chuỗi chứng chỉ (còn gọi là "root"), sẽ có một chứng chỉ sử dụng khóa riêng để tự ký. Điều này giúp loại bỏ vấn đề đệ quy vô hạn, nhưng nó không khắc phục được vấn đề xác thực. Bất cứ ai cũng có thể tạo chứng chỉ tự ký có ghi bất cứ điều gì trên đó, giống như tôi có thể tạo bằng tốt nghiệp Princeton giả nói rằng tôi học ba chuyên ngành chính trị, vật lý lý thuyết, và áp dụng đá mông và sau đó ký tên của mình ở phía dưới.

Giải pháp [hơi khó chịu] cho vấn đề này chỉ là chọn một số bộ chứng chỉ tự ký mà bạn tin tưởng rõ ràng. Ví dụ: tôi có thể nói: "Tôi tin tưởng vào chứng chỉ tự ký Verisign này."

Với sự tin tưởng rõ ràng đó, giờ tôi có thể xác nhận toàn bộ chuỗi chứng chỉ. Cho dù có bao nhiêu chứng chỉ trong chuỗi, tôi có thể xác nhận từng chữ ký cho đến tận gốc. Khi tôi đến root, tôi có thể kiểm tra xem chứng chỉ gốc đó có phải là chứng chỉ mà tôi tin tưởng rõ ràng hay không. Nếu vậy, sau đó tôi có thể tin tưởng toàn bộ chuỗi.

Trao niềm tin

Xác thực trong TLS sử dụng một hệ thống tin cậy được trao . Nếu tôi muốn thuê một thợ cơ khí tự động, tôi có thể không tin bất kỳ thợ máy ngẫu nhiên nào mà tôi tìm thấy. Nhưng có lẽ bạn tôi chứng nhận cho một thợ máy cụ thể. Vì tôi tin tưởng bạn mình, nên tôi có thể tin người thợ đó.

Khi bạn mua một máy tính hoặc tải xuống một trình duyệt, nó đi kèm với một vài trăm chứng chỉ gốc mà nó tin tưởng rõ ràng. [4] Các công ty sở hữu và vận hành các chứng chỉ đó có thể trao niềm tin đó cho các tổ chức khác bằng cách ký chứng chỉ của họ.

Đây là một hệ thống hoàn hảo. Đôi khi CA có thể cấp chứng chỉ sai. Trong những trường hợp đó, chứng chỉ có thể cần phải thu hồi. Việc thu hồi là khó khăn vì chứng chỉ được cấp sẽ luôn luôn đúng về mặt mật mã; một giao thức ngoài băng là cần thiết để tìm ra những chứng chỉ hợp lệ trước đó đã bị thu hồi. Trong thực tế, một số giao thức này không an toàn và nhiều trình duyệt không kiểm tra chúng.

Đôi khi toàn bộ CA bị xâm phạm. Ví dụ: nếu bạn đột nhập vào Verisign và đánh cắp khóa ký gốc của họ, thì bạn có thể giả mạo bất kỳ chứng chỉ nào trên thế giới. Lưu ý rằng điều này không chỉ ảnh hưởng đến khách hàng của Verisign: ngay cả khi chứng chỉ của tôi được ký bởi Thawte (đối thủ cạnh tranh với Verisign), điều đó không thành vấn đề. Chứng chỉ của tôi vẫn có thể được giả mạo bằng cách sử dụng khóa ký bị xâm phạm từ Verisign.

Đây không chỉ là lý thuyết. Nó đã xảy ra trong tự nhiên. DigiNotar đã bị hack nổi tiếng và sau đó bị phá sản. Comodo cũng bị hack , nhưng không hiểu sao họ vẫn duy trì hoạt động cho đến ngày nay.

Ngay cả khi CA không bị xâm phạm trực tiếp, vẫn có những mối đe dọa khác trong hệ thống này. Ví dụ, một chính phủ sử dụng sự ép buộc pháp lý để buộc CA ký giấy chứng nhận giả mạo. Chủ lao động của bạn có thể cài đặt chứng chỉ CA của riêng họ trên máy tính nhân viên của bạn. Trong các trường hợp khác nhau này, lưu lượng truy cập mà bạn mong đợi là "an toàn" thực sự hoàn toàn hiển thị / có thể sửa đổi đối với tổ chức kiểm soát chứng chỉ đó.

Một số thay thế đã được đề xuất, bao gồm Hội tụ , TACKDane .

Chú thích

[1] Dữ liệu chứng chỉ TLS được định dạng theo tiêu chuẩn X.509 . X.509 dựa trên ASN.1 ("Ký hiệu cú pháp trừu tượng số 1"), có nghĩa là nó không phải là định dạng dữ liệu nhị phân. Do đó, X.509 phải được mã hóa thành định dạng nhị phân. DER và PEM là hai bảng mã phổ biến nhất mà tôi biết.

[2] Trong thực tế, giao thức thực sự chuyển sang một mật mã đối xứng, nhưng đó là một chi tiết không liên quan đến câu hỏi của bạn.

[3] Có thể, CA thực sự xác nhận bạn là ai trước khi ký chứng chỉ của bạn. Nếu họ không làm điều đó, thì tôi có thể tạo chứng chỉ cho google.com và yêu cầu CA ký tên. Với chứng nhận đó, tôi có thể kết nối bất kỳ kết nối "an toàn" nào với google.com. Do đó, bước xác nhận là một yếu tố rất quan trọng trong hoạt động của CA. Thật không may, không rõ ràng quá trình xác nhận này nghiêm ngặt như thế nào tại hàng trăm CA trên toàn thế giới.

[4] Xem danh sách CA đáng tin cậy của Mozilla .


Khóa riêng là gì?
Koray Tugay

bạn đã quên đề cập rằng khóa công khai là một phần của tệp chứng chỉ được gửi đến trang web để giải mã pt dữ liệu mà sever của bạn được mã hóa ở vị trí đầu tiên.
mamdouh alramadan

Cảm ơn @mamdouhalramadan. Tôi đã chỉnh sửa để đề cập đến điều đó.
Đánh dấu E. Haase

2
@mamdouhalramadan "khóa công khai được ... gửi đến trang web để giải mã dữ liệu". Làm thế nào có thể sử dụng khóa công khai để giải mã dữ liệu?
Teddy

@ateddy Bạn nói đúng. Nó không thể. Khóa công khai chỉ được sử dụng để xác thực. Khiếu nại ở đây là các cặp khóa cũng được sử dụng để mã hóa và giải mã là không chính xác. Khóa phiên đàm phán an toàn được sử dụng cho điều đó.
Hầu tước Lorne

53

HTTPS là sự kết hợp giữa HTTPSSL (Lớp cổng bảo mật) để cung cấp liên lạc được mã hóa giữa máy khách (trình duyệt) và máy chủ web (ứng dụng được lưu trữ tại đây).

Tại sao cần thiết?

HTTPS mã hóa dữ liệu được truyền từ trình duyệt đến máy chủ qua mạng. Vì vậy, không ai có thể đánh hơi dữ liệu trong quá trình truyền.

Làm thế nào kết nối HTTPS được thiết lập giữa trình duyệt và máy chủ web?

  1. Trình duyệt cố gắng kết nối với https://payment.com .
  2. máy chủ Payment.com gửi chứng chỉ đến trình duyệt. Chứng chỉ này bao gồm khóa chung của máy chủ Payment.com và một số bằng chứng cho thấy khóa công khai này thực sự thuộc về Payment.com.
  3. Trình duyệt xác minh chứng chỉ để xác nhận rằng nó có khóa công khai phù hợp cho Payment.com.
  4. Trình duyệt chọn một khóa đối xứng K ngẫu nhiên mới để sử dụng cho kết nối của nó với máy chủ Payment.com. Nó mã hóa K theo khóa công khai.com.
  5. Payment.com giải mã K bằng khóa riêng của nó. Bây giờ cả trình duyệt và máy chủ thanh toán đều biết K, nhưng không ai khác làm được.
  6. Bất cứ lúc nào trình duyệt muốn gửi một cái gì đó đến Payment.com, nó sẽ mã hóa nó theo K; máy chủ Payment.com giải mã nó khi nhận được. Bất cứ khi nào máy chủ Payment.com muốn gửi một cái gì đó đến trình duyệt của bạn, nó sẽ mã hóa nó theo K.

Luồng này có thể được biểu diễn bằng sơ đồ sau: nhập mô tả hình ảnh ở đây


1
Phần về mã hóa và gửi khóa phiên và giải mã nó tại máy chủ đã hoàn tất và hoàn toàn là rác rưởi. Khóa phiên không bao giờ được truyền đi: nó được thiết lập thông qua thuật toán negoatiaon khóa an toàn. Vui lòng kiểm tra sự thật của bạn trước khi đăng bài vô nghĩa như thế này. RFC 2246.
Hầu tước Lorne

Tại sao trình duyệt không sử dụng khóa chung của máy chủ để mã hóa dữ liệu khi đăng lên máy chủ, thay vì tạo khóa đối xứng K ngẫu nhiên mới ở bước 4?
KevinBui

1
@KevinBui Vì việc gửi phản hồi từ máy chủ sẽ yêu cầu khách hàng phải có cặp khóa và vì mã hóa bất đối xứng rất chậm.
Hầu tước Lorne

3

Tôi đã viết một bài đăng blog nhỏ trong đó thảo luận về quá trình này một cách ngắn gọn. Xin vui lòng để xem.

Bắt tay SSL

Một đoạn nhỏ từ cùng là như sau:

"Máy khách gửi yêu cầu đến máy chủ qua HTTPS. Máy chủ gửi một bản sao chứng chỉ SSL + khóa chung. Sau khi xác minh danh tính của máy chủ với cửa hàng CA đáng tin cậy cục bộ, máy khách sẽ tạo khóa phiên bí mật, mã hóa nó bằng cách sử dụng công khai của máy chủ khóa và gửi nó. Máy chủ giải mã khóa phiên bí mật bằng khóa riêng của nó và gửi xác nhận đến máy khách. Kênh an toàn được thiết lập. "


"Sau khi xác minh danh tính của máy chủ với cửa hàng CA đáng tin cậy cục bộ" - điều này không hoàn toàn đúng. Tôi có thể sử dụng chứng chỉ tự ký và HTTPS sẽ hoạt động - Tôi có thể nhận kết nối HTTPS an toàn đến máy chủ . Chứng chỉ tin cậy chỉ xuất hiện khi tôi muốn đảm bảo rằng tôi đang nói chuyện với đúng máy chủ.
Teddy

Phần về mã hóa và gửi khóa phiên và giải mã nó tại máy chủ đã hoàn tất và hoàn toàn là rác rưởi. Khóa phiên không bao giờ được truyền đi: nó được thiết lập thông qua thuật toán negoatiaon khóa an toàn. Vui lòng kiểm tra sự thật của bạn trước khi đăng bài vô nghĩa như thế này. RFC 2246.
Hầu tước Lorne

@Teddy Điều đó không đúng. Kiểm tra chứng chỉ tin cậy là một phần bắt buộc của SSL. Nó có thể được bỏ qua nhưng nó thường có hiệu lực: chứng chỉ tự ký không hoạt động mà không có biện pháp đặc biệt loại này hay loại khác.
Hầu tước Lorne

2

Mehaase đã giải thích chi tiết rồi. Tôi sẽ thêm 2 xu của tôi vào loạt bài này. Tôi có nhiều blogpost xoay quanh bắt tay và chứng chỉ SSL. Mặc dù hầu hết điều này xoay quanh máy chủ web IIS, bài viết vẫn có liên quan đến bắt tay SSL / TLS nói chung. Dưới đây là một vài để bạn tham khảo:

Đừng coi CHỨNG NHẬN & SSL là một chủ đề. Hãy coi họ như 2 chủ đề khác nhau và sau đó thử xem họ hợp tác với ai. Điều này sẽ giúp bạn trả lời câu hỏi.

Thiết lập niềm tin giữa các bên giao tiếp thông qua Cửa hàng Chứng chỉ

Giao tiếp SSL / TLS chỉ hoạt động trên cơ sở tin cậy. Mỗi máy tính (máy khách / máy chủ) trên internet có một danh sách các CA gốc và CA trung gian mà nó duy trì. Đây là định kỳ cập nhật. Trong quá trình bắt tay SSL, điều này được sử dụng như một tài liệu tham khảo để thiết lập lòng tin. Đối với exampe, trong quá trình bắt tay SSL, khi máy khách cung cấp chứng chỉ cho máy chủ. Máy chủ sẽ cố gắng kiểm tra xem CA đã cấp chứng chỉ có trong danh sách CA không. Khi không thể làm điều này, nó tuyên bố rằng nó không thể thực hiện xác minh chuỗi chứng chỉ. (Đây là một phần của câu trả lời. Nó cũng nhìn vào AIAcho việc này.) Máy khách cũng thực hiện xác minh tương tự cho chứng chỉ máy chủ nhận được trong Server Hello. Trên Windows, bạn có thể thấy các cửa hàng chứng chỉ cho máy khách & Máy chủ thông qua PowerShell. Thực hiện bên dưới từ bảng điều khiển PowerShell.

Chứng chỉ PS:> ls Vị trí: CurrentUser StoreNames: {TrustedPublisher, ClientAuthIssuer, Root, UserDS ...}

Vị trí: LocalMachine StoreNames: {TrustedPublisher, ClientAuthIssuer, Remote Desktop, Root ...}

Các trình duyệt như Firefox và Opera không dựa vào HĐH cơ bản để quản lý chứng chỉ. Họ duy trì các cửa hàng chứng chỉ riêng của họ.

Bắt tay SSL sử dụng cả Mật mã khóa đối xứng và khóa công khai. Xác thực máy chủ xảy ra theo mặc định. Xác thực ứng dụng khách là tùy chọn và tùy thuộc vào điểm cuối Máy chủ có được cấu hình để xác thực ứng dụng khách hay không. Tham khảo bài viết trên blog của tôi vì tôi đã giải thích chi tiết này.

Cuối cùng cho câu hỏi này

Làm thế nào để giao thức HTTPS nhận ra chứng chỉ? Tại sao HTTP không thể hoạt động với chứng chỉ khi đó là chứng chỉ thực hiện tất cả công việc tin cậy / mã hóa / xác thực?

Chứng chỉ đơn giản là một tệp có định dạng được xác định theo tiêu chuẩn X.509 . Đó là một tài liệu điện tử chứng minh danh tính của một bên giao tiếp. HTTPS = HTTP + SSL là một giao thức xác định các nguyên tắc về cách 2 bên nên giao tiếp với nhau.

THÊM THÔNG TIN

  • Để hiểu chứng chỉ, bạn sẽ phải hiểu chứng chỉ là gì và cũng đọc về Quản lý chứng chỉ. Đây là những điều quan trọng.
  • Khi điều này được hiểu, sau đó tiến hành bắt tay TLS / SSL. Bạn có thể giới thiệu RFC cho điều này. Nhưng họ là bộ xương xác định các hướng dẫn. Có một số blogpost bao gồm cả của tôi giải thích chi tiết này.

Nếu hoạt động trên được thực hiện, thì bạn sẽ có sự hiểu biết công bằng về Chứng chỉ và SSL.

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.