2011-04-19 27 views
6

Đối với một chương trình tôi đang viết, tôi muốn sử dụng TLS (hoặc một cái gì đó tương tự) để đóng gói giao thức của ứng dụng của tôi. Điều này sẽ giảm thiểu cả số lượng công việc tôi phải làm cũng như số lỗ hổng mà tôi có thể vô tình tạo ra.Mật mã và xác thực thông qua TLS với Web of Trust trong Java

Chương trình của tôi được thiết kế ngang hàng mặc dù một hoặc nhiều máy chủ cung cấp một số dịch vụ để giúp một người dùng định vị một dịch vụ khác (nó đăng ký địa chỉ IP/cổng combo) nhưng làm ít. Tôi muốn làm cho hệ thống này có khả năng chịu lỗi, vì vậy việc các máy chủ này hoạt động như một Tổ chức phát hành chứng chỉ là không thể chấp nhận được vì sự thỏa hiệp của máy chủ hoặc khóa của máy chủ sẽ ảnh hưởng đến quá nhiều người dùng. Do đó tôi có kế hoạch sử dụng một Web of Trust.

Vấn đề chính khi sử dụng TLS là đặc tả TLS 1.2 ban đầu (RFC 5246) không cung cấp cho việc sử dụng chứng chỉ OpenPGP. Nó có vẻ là rất trung tâm x.509. RFC 6091, mà lỗi thời RFC 5081 và mở rộng RFC 5246, làm cho các điều khoản cho một phần mở rộng cho TLS thực hiện những gì tôi muốn. Vấn đề là tôi không nghĩ rằng BouncyCastle thực hiện phần mở rộng này và tôi không thể tìm thấy một thư viện mã hóa Java nào. Tôi cũng không muốn viết của riêng mình/đóng góp cho BC bởi vì tôi thực sự xấu không phạm sai lầm và tôi cũng rất lười biếng.

Một vấn đề khác là BouncyCastle cung cấp "một API TLS trọng lượng nhẹ phía máy khách" nhưng vì phần mềm này là P2P, API phía máy chủ cũng cần thiết để tôi có thể sử dụng TLS bằng cách làm cho nó tin rằng bắt nguồn từ kết nối là máy khách. Tôi khá chắc chắn rằng một khi cái bắt tay hoàn thành thì nó giống nhau.

Câu hỏi: Có cách nào để tôi vẫn có thể sử dụng TLS (mà tôi rất nghi ngờ) không? Có một giao thức như TLS được thiết kế cho P2P hay ít nhất có thể hoạt động theo cách này (như tôi tin TLS có thể), nhưng có thể làm việc với chứng chỉ OpenPGP? Nếu không phải vậy, tôi có nên theo đuổi ý tưởng được giải thích trong this question và triển khai lớp của riêng tôi lấy khái niệm từ TLS không?

Liên kết đến RFC: RFC 5246RFC 6091

Trả lời

1

Trong TLS, các bộ phận X.509 đang thực sự xử lý như đốm màu đục:

  • Các máy chủ sẽ gửi giấy chứng nhận của mình (và một số giấy chứng nhận helper, nếu nó muốn vì vậy) như (một danh sách) chuỗi (các) mảng trống của byte (độ dài ba byte, tiếp theo là chứng chỉ được mã hóa dưới dạng byte tùy ý).
  • Khi máy chủ yêu cầu xác thực máy khách khóa công khai, nó sẽ gửi danh sách "tên" được cho là tên X.500 được mã hóa của CA gốc mà máy chủ sẽ nhận ra - một lần nữa, các đốm màu đục (hai chiều dài byte).
  • Máy khách, khi (nếu) nó gửi một chứng chỉ (chuỗi), sử dụng định dạng giống với máy chủ.

Như TLS được định nghĩa, cả client và server có nghĩa vụ phải sử dụng các đồng đẳng khóa công khai, mà họ nhận được trong bất kỳ cách nào họ phù hợp thấy và đó là chủ yếu ra khỏi phạm vi của đặc tả TLS: Giấy chứng nhận trao đổi qua dây được coi là người trợ giúp. Vì vậy, sẽ không có vấn đề gì khi thực sự gửi các khóa công khai được mã hoá OpenPGP trong các đốm màu đó, miễn là cả máy khách và máy chủ mong đợi nó - và vì bạn kiểm soát mã trên cả hai, điều này sẽ không có vấn đề gì.

Vấn đề của bạn sau đó "đơn giản" trở thành vấn đề thực hiện triển khai TLS chấp nhận đưa cho bạn các đốm màu mà không bị nghẹt thở trên chúng.Tôi biết không có triển khai TLS Java hiện có nào sẽ phù hợp với hóa đơn, vì vậy bạn có thể phải viết một chút mã - nhưng tôi khuyên bạn không nên chi tiết với các chi tiết giao thức TLS ngoại trừ việc xử lý các blobs chứng chỉ. Những điều đó là tinh tế và yếu đuối dễ tạo ra ...

+0

Rất tiếc, điều này không đúng. Việc phân tích chứng chỉ là bắt buộc đối với việc bắt tay TLS. Đây là lý do cho phần mở rộng RFC 6091 cho TLS. – Nikos

+0

Thực ra tôi đã thực hiện các máy khách và máy chủ TLS không phân tích chứng chỉ. Vì vậy, nó là có thể. Khi máy khách nhận được chứng chỉ máy chủ, nó sẽ đưa các đốm màu vào một cuộc gọi lại bên ngoài để gửi lại khóa công khai để sử dụng - trong trường hợp của tôi, gọi lại đã giải thích các đốm màu như các chứng chỉ X.509 (mà nó đã phân tích cú pháp và xác thực), nhưng nó chắc chắn có thể giải thích cho họ bằng cách khác, hoặc thậm chí ném chúng đi và sử dụng một khóa công khai máy chủ hardcoded, đó là hợp lệ trong một số thiết lập. –

+0

Thực tế là việc triển khai của bạn đã xử lý các chứng chỉ dưới dạng các đốm màu, nó không loại bỏ yêu cầu của TLS để phân tích cú pháp đó. Bạn chỉ cần ủy quyền nó cho một cuộc gọi lại, nhưng vẫn phân tích cú pháp phải được thực hiện để hoàn tất giao thức. – Nikos

4

Thư viện duy nhất mà tôi biết để hỗ trợ RFC 6091 (nghĩa là TLS với chứng chỉ openpgp) là GnuTLS nhưng tôi không biết bạn có thể sử dụng trong Java. Hoặc bạn có thể sao chép ngữ nghĩa SSH, nơi bạn lưu trữ khóa công khai của các đồng nghiệp của mình bằng cách sử dụng chứng chỉ tự ký X.509.

1

Theo như tôi biết, việc thực hiện Sun/Oracle JSSE chỉ giao dịch với TrustManagers X.509 (mà bạn có thể tùy chỉnh để xử lý phần mở rộng nhất định, nhưng vẫn mong chờ một chứng chỉ X.509 cấu trúc hợp lệ.

Nó có thể sử dụng API bảo mật của Java để triển khai RFC 6091, nhưng tôi không chắc chắn như thế nào. Nó chắc chắn hoạt động hơn là chỉ tinh chỉnh TrustManagers, vì bạn sẽ phải đi sâu hơn vào việc triển khai TLS của Java. nếu nó dành cho một máy chủ riêng biệt, bạn có thể sử dụng lại tài liệu chính từ chứng chỉ PGP vào chứng chỉ X.509 và đặt chứng chỉ PGP ban đầu (với tất cả các chữ ký của nó) như một đốm màu trong một cus tom X.509 mở rộng (vì nó ít nhiều được thực hiện here). Vấn đề ở đây sẽ là khả năng tương tác, vì phần mở rộng như vậy sẽ không phải là một tiêu chuẩn. Việc thực hiện TrustManager trong Java có thể hiểu được phần mở rộng chắc chắn khả thi, và bạn sẽ không cần phải đào sâu vào bên trong ngăn xếp TLS của Java, bạn chỉ phải đối phó với TrustManagers tùy chỉnh để khởi tạo SSLContexts của bạn.

+0

Tôi cũng sẽ bị buộc phải sử dụng phương pháp này (blob trong phần mở rộng tùy chỉnh X509) vì nếu không tôi sẽ phải viết một triển khai TLS tùy chỉnh hoặc hack cái gì đó đã tồn tại - và nó không phải là thứ tôi có thể làm vào lúc này. –

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