2011-12-23 111 views
7

Tôi đang làm việc trên một dự án thú cưng (cuối cùng, khi được thực hiện) cho phép truyền tệp an toàn (có nhiều hơn thế, nhưng phần còn lại không liên quan đặc biệt). Tôi muốn sử dụng thư viện OpenSSL, vì nó có vẻ là thư viện mã hóa miễn phí hoàn chỉnh nhất (và tôi cần hỗ trợ mã hóa và băm đối xứng cơ bản, ngoài SSL/TLS).SSL/TLS không có chứng chỉ

Tôi đang tìm cách triển khai một sơ đồ bảo mật tương tự cho SSH. Về cơ bản, người dùng sẽ kết nối với máy tính của tôi bằng TLSv1 (SSLv3.1). Tôi muốn kết nối thành công bất kể an ninh. Sau đó, tôi muốn có thể kiểm tra khóa công khai (không phải toàn bộ chứng chỉ) mà người dùng đã sử dụng. Khóa đó sẽ được so sánh với các khóa công cộng đã biết và nếu nó khớp, thì người dùng sẽ được phép truy cập một bộ lệnh nhất định. Nếu không khớp, người dùng sẽ có tùy chọn sử dụng kết nối để đăng ký để có khóa công cộng của họ được thêm vào bộ sưu tập của tôi, nhưng ngoài việc đó sẽ không thể truy cập các dịch vụ của tôi.

Tôi không có bất kỳ nhu cầu cụ thể nào về chứng chỉ tại đây. Nó sẽ đơn giản hơn nhiều nếu tôi chỉ có thể bỏ qua tất cả các chi tiết chứng chỉ và chỉ làm việc với các khóa mã hóa thô. Điều này là do mô hình này tuân theo mô hình web-of-trust, không phải là mô hình phân cấp được sử dụng bởi hầu hết các kết nối SSL/TLS, vì vậy tôi không cần bất kỳ chứng chỉ nào của CA hoặc được ký.

Thật không may, tài liệu của hầu hết OpenSSL là, tốt, không tồn tại. Tất cả các bài viết liên quan mà tôi tìm thấy dường như bị chiếm đóng với việc thiết lập kết nối SSL/TLS "chuẩn", trong đó chứng chỉ của máy chủ được xác minh tất cả các cách lên đến một bộ chứng chỉ gốc. Điều này có thể hữu ích, nhưng thật khó để tôi tìm ra cách để có được các kết nối SSL không truyền thống này và chạy.

Có ai có thể đề xuất bất kỳ bài viết hoặc tài liệu nào có thể giúp tôi tìm ra cách thực hiện điều này không?

(Việc sử dụng OpenSSL không được đặt trong đá và tôi có thể chuyển sang thư viện khác nếu nó cung cấp cách tốt hơn để hoàn thành việc này, cũng như băm [SHA-512] và mã hóa đối xứng [AES]. ' m nhắm vào việc nhắm mục tiêu Linux, nhưng sẽ tốt nếu sản phẩm cuối cùng được chuyển sang Windows để bạn bè của tôi cũng có thể sử dụng nó.)

+1

So sánh khóa công khai với danh sách khóa công khai về cơ bản là sử dụng mật khẩu, sẽ đánh bại toàn bộ PKI-ness của https và ssl. Đề xuất tạo và sử dụng chứng chỉ tự ký là một điều tốt nếu bạn kiểm soát cả phần mềm máy khách và máy chủ (để bạn có thể cấu hình mối quan hệ tin cậy). –

+1

@AdamLiss, không, nó không giống như mật khẩu: người dùng không bao giờ phải gửi khóa riêng, trong khi người dùng sẽ phải gửi mật khẩu. (Và so sánh các chứng chỉ tự ký trong một danh sách khá giống với việc so sánh các khóa công khai của chúng.) – Bruno

+0

Tôi không sử dụng PKI. Ý tưởng là nếu bạn là "người bạn" của tôi (tôi có khóa công khai/cert), thì bạn có thể tải xuống các tệp (mà tôi chỉ định) từ các tệp PLUS trên máy tính mà tôi có thể tải xuống từ bạn bè của tôi. Việc nắm bắt là bạn không thể thấy nơi các tập tin đến từ (có nghĩa là, nếu A và B là bạn bè, và B và C là bạn bè, A có thể tải xuống từ C đến B, nhưng không biết về C ở tất cả) . Ít nhất, đó là ý tưởng trong một nutshell. [OneSwarm] (http://www.oneswarm.org/) đã cho tôi cảm hứng cho dự án này. – Ethan

Trả lời

3

Để mở rộng về câu trả lời của Eugene (Tôi sẽ đưa điều này như một bình luận, nhưng đó là một chút dài) ...

Sau khi thực hiện điều này loại điều với FOAF+SSL project (sau này đổi tên WebID), gắn bó với X .509 chứng chỉ giúp việc triển khai dễ dàng hơn, đơn giản vì hầu hết các ngăn xếp SSL/TLS đều được thiết kế với chúng (và API của chúng phản ánh điều này).

Thời gian qua tôi đã kiểm tra FOAF + SSL, kiểm tra PKI truyền thống vẫn được đặt cho khách hàng để kiểm tra chứng chỉ máy chủ. Một tùy chọn khác, tương tự như SSH, sẽ là chấp nhận khóa công khai/chứng chỉ lần đầu tiên bạn gặp phải và cảnh báo người dùng khi nó thay đổi. Đó là nhiều hơn hoặc ít hơn cách SSH hoạt động anyway (đặc biệt, tôi đoán rằng vài người thực sự kiểm tra dấu vân tay của khóa ra khỏi ban nhạc lần đầu tiên họ nhìn thấy nó).

Xét chỉ việc sử dụng client-Giấy chứng nhận (mặc dù một số điều này có thể áp dụng đối với Certs máy chủ trong một cách tương tự):

  • Hầu hết các thư viện máy chủ dường như để có thể xử lý các chứng chỉ X.509, nhưng cho phép bạn thay đổi cách chúng được xác minh (ví dụX509TrustManager bằng Java).
  • Mặc dù bạn không thể tin tưởng bất cứ điều gì mà client-cert nói cho đến khi bạn đã xác minh bằng cách khác, có thể nhúng một số thông tin bổ sung (chẳng hạn như DN chủ đề hoặc Tên thay thế chủ đề để xem người dùng yêu cầu) có thể giúp (a) người dùng tổ chức các chứng chỉ của họ và (b) đưa ra gợi ý cho người xác minh để biết cần phải tìm gì. Một khóa công khai trần có thể khó quản lý.
  • Một số công cụ máy khách hiện có (đặc biệt là trình duyệt) sử dụng chứng chỉ X.509 khi thực hiện xác thực ứng dụng khách SSL/TLS. Không cần phải thực hiện nhiều việc để cấu hình một máy khách để sử dụng một chứng chỉ X.509 tự ký (trái với một chứng chỉ từ một PKI). (Có rất ít công cụ hỗ trợ OpenPGP cho TLS, tôi không chắc chắn bất kỳ công cụ nào có thể sử dụng nó như một hình thức chứng chỉ ứng dụng khách.)
  • Vì bạn sẽ không thể tin cậy chứng chỉ mà không có kiểm tra bên ngoài, nó không quan trọng cho dù đó là tự ký hay không (nghĩa là nhà phát hành và chủ đề là như nhau), ít nhất giả sử người dùng sẽ không gửi cho bạn một chứng nhận mà nó sẽ không đồng ý (vì vậy nó sẽ không có để được đóng dấu bằng khóa riêng của nó). Kết quả là bạn có thể xây dựng một dịch vụ để phát hành chứng chỉ khá dễ dàng. Ví dụ, tạo khóa trong trình duyệt thuận tiện cho những người dùng không muốn sử dụng các lệnh openssl hoặc keytool. Here là một dịch vụ ví dụ sẽ cấp chứng chỉ với SAN mà người dùng muốn (có thể có các phiên bản gần đây hơn nếu bạn kiểm tra dự án FOAF + SSL/WebID). Cho dù khóa riêng hoặc tổ chức phát hành tên dịch vụ nào chỉ sử dụng các vấn đề, nhưng vì các trình duyệt được thiết kế xung quanh PKI truyền thống, nó không làm cho việc sử dụng chứng chỉ tự ký thực sự dễ dàng.

Ngoài ra còn có vấn đề khi yêu cầu chứng chỉ ứng dụng khách cụ thể. Đặc tả TLS 1.1 cho phép trống certification authorities (xem RFC 4346), trong khi TLS 1.0 im lặng về chủ đề này. Trong thực tế, ngay cả với TLS 1.0, hầu hết các công cụ của khách hàng dường như hài lòng với một danh sách trống (chúng sẽ chỉ cung cấp nhiều lựa chọn hơn). Nếu bạn muốn chứng chỉ của mình cho hệ thống của mình dễ nhận biết, bạn có thể sử dụng cùng một nhà phát hành DN cho tất cả các chứng chỉ này, ngay cả khi họ không ký với cùng một khóa riêng trong thực tế (một lần nữa, vì bạn sẽ bỏ qua chữ ký).

+0

Ý tưởng là tôi sẽ tạo mã mời và đưa mã đó cho bạn bè. Cùng với mã, tôi sẽ nhập một số chi tiết về người bạn mới của tôi (cụ thể, một địa chỉ mà họ đang ở, như ethan.no-ip.org). Khi họ gửi "ứng dụng", họ sử dụng mã mời và cũng có thể gửi tin nhắn.Chương trình sẽ kiểm tra để chắc chắn rằng lời mời là chính xác và địa chỉ mà tôi đã nhập giải quyết đến nguồn gốc của ứng dụng tại thời điểm nó được tạo. Tôi cũng có thể làm cho nó để bạn tự kiểm tra tin nhắn. Ý tưởng là đây là cách bạn xác nhận "bạn bè" mới. – Ethan

2

Sử dụng chứng chỉ tự ký - điều này giống với khóa "thô" nhưng dễ hơn quản lý (xem this question về cách chấp nhận hoặc không chấp nhận chứng chỉ tự ký trong openssl).

+0

Vì vậy, câu trả lời sẽ là "Không có cách nào dễ dàng để không sử dụng chứng chỉ nào cả. Dễ dàng hơn khi chỉ sử dụng chứng chỉ tự ký". Tôi đoán rằng công trình. Tôi vẫn có thể bỏ qua tải bất kỳ chứng chỉ gốc nào, đúng không? Tôi đoán rằng việc theo dõi rõ ràng là: Tôi có thể buộc OpenSSL chỉ ** chấp nhận các chứng chỉ tự ký không? – Ethan

+0

@Ethan, không có điểm hạn chế quyền truy cập vào các chứng chỉ tự ký (và từ chối những người khác). Nếu bạn sẵn sàng chấp nhận bất kỳ chứng chỉ tự ký nào, bạn cũng có thể chấp nhận bất kỳ điều gì, vì bạn sẽ không thể kiểm tra tổ chức phát hành DN là người họ nói (chỉ sử dụng chứng chỉ), dù có hay không tổ chức phát hành DN = đối tượng DN trở nên không liên quan. – Bruno

+0

@Ethan nói chung SSL hỗ trợ xác thực bằng các khóa OpenPGP hoặc với khóa bí mật được chia sẻ trước. Nhưng không ai trong số này sẽ phù hợp. Đối với việc chấp nhận chỉ tự ký - bạn có thể tự động kiểm soát những gì để tin tưởng và tôi đoán trong số các kiểm tra khác OpenSSL nên cho phép bạn kiểm tra xem chứng chỉ là tự ký (các lĩnh vực phát hành và chủ đề phải giống hệt nhau). –

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