2009-07-09 43 views
12

Đây là câu hỏi của tôi.Thêm hỗ trợ SSL cho mã TCP & UDP hiện tại?

Ngay bây giờ tôi có một ứng dụng máy chủ Linux (viết bằng C++ - gcc) (. Visual Studio 9, Qt 4.5) mà giao tiếp với Windows C++ ứng dụng client

các rất Cách dễ nhất để thêm là gì Hỗ trợ SSL cho cả hai bên để bảo đảm thông tin liên lạc, mà không hoàn toàn đưa giao thức hiện tại?

Đây là ứng dụng VOIP sử dụng kết hợp UDP và TCP để thiết lập kết nối ban đầu và thực hiện công cụ đường hầm, sau đó sử dụng UDP cho dữ liệu phát trực tuyến.

Tôi đã gặp nhiều vấn đề trong quá khứ với việc tạo chứng chỉ bảo mật từ đầu cần thiết để công cụ này hoạt động.

Mã mẫu làm việc hiện tại sẽ là lý tưởng.

Cảm ơn bạn!

Trả lời

11

SSL is very complex, vì vậy bạn sẽ muốn sử dụng thư viện.

Có một số tùy chọn, chẳng hạn như Keyczar, Botan, cryptlib, v.v. Mỗi thư viện (hoặc các thư viện được đề xuất bởi những người khác, chẳng hạn như Boost.Asio hoặc OpenSSL) sẽ có mã mẫu.


Trả lời câu hỏi thứ hai của bạn (cách tích hợp thư viện vào mã hiện tại mà không gây đau quá nhiều): tùy thuộc vào mã hiện tại của bạn. Nếu bạn đã có các hàm đơn giản gọi phương thức Winsock hoặc socket để gửi/nhận int s, strings, v.v ... thì bạn chỉ cần viết lại các đường ruột của các hàm đó. Và, tất nhiên, thay đổi mã thiết lập socket để bắt đầu. Mặt khác, nếu bạn gọi trực tiếp các chức năng Winsock/socket thì có thể bạn sẽ muốn viết các hàm có ngữ nghĩa tương tự nhưng gửi dữ liệu được mã hóa và thay thế các cuộc gọi Winsock bằng các chức năng đó.

Tuy nhiên, bạn có thể muốn xem xét chuyển sang một cái gì đó như Google Protocol Buffers hoặc Apache Thrift (a.k.a. Facebook Tiết kiệm). Tài liệu về Protocol Buffers của Google cho biết, "Trước các bộ đệm giao thức, đã có một định dạng cho các yêu cầu và phản hồi sử dụng marshalling tay/unmarshalling các yêu cầu và phản hồi, và hỗ trợ một số phiên bản của giao thức. ... "

Bạn hiện đang trong giai đoạn marshalling/unmarshalling. Nó có thể làm việc, và trong thực tế, một dự án tôi làm việc trên không sử dụng phương pháp này. Nhưng thật tuyệt vời khi để lại điều đó cho một thư viện; đặc biệt là một thư viện đã đưa ra một số suy nghĩ để cập nhật phần mềm trong tương lai.

Nếu bạn đi tuyến đường này, bạn sẽ thiết lập kết nối mạng của mình bằng thư viện SSL và sau đó bạn sẽ đẩy dữ liệu Bộ nhớ đệm/Protocol Buffer qua các kết nối đó. Đó là nó. Nó liên quan đến việc tái cấu trúc rộng rãi, nhưng bạn sẽ kết thúc với ít mã hơn để duy trì. Khi chúng tôi giới thiệu Protocol Buffers vào trong codebase của dự án mà tôi đã đề cập, chúng tôi có thể loại bỏ được khoảng 300 dòng mã marshalling/demarshalling.

+0

Hi, Max, Cảm ơn bạn đã thêm chi tiết. (Có lẽ câu hỏi ban đầu của tôi không được diễn đạt rõ ràng.) Câu trả lời của bạn cho biết thêm thông tin chi tiết nhấp vào cho tôi. Tôi có một quá trình dựa trên socket được mã hóa khá xấu xí trong mã thực hiện một loại "bắt tay" với máy chủ và đặc biệt thiết lập đường hầm cổng UDP. Phần còn lại của mã mạng được trừu tượng hóa thành các hàm trợ giúp loại "SendXMLViaTCPAndWaitForResponse()". Chỉ cần cắn đạn không phải là khó khăn, nó nên liên quan đến ít recoding vượt ra ngoài fcts helper. Cảm ơn một lần nữa cho việc đóng đinh này xuống. –

4

Tôi khuyên bạn nên sử dụng GnuTLS trên cả máy khách và phía máy chủ, chỉ cho kết nối TCP. Hãy quên đi dữ liệu UDP ngay bây giờ. Tài liệu GnuTLS có example code để viết cả khách hàng và máy chủ. Vui lòng hiểu rằng ít nhất phía máy chủ (thường là trình đáp ứng TCP) cần có chứng chỉ; phía máy khách có thể làm việc với nhận dạng ẩn danh (mặc dù thậm chí có một ví dụ không có chứng chỉ máy chủ, chỉ sử dụng trao đổi khóa DH - cho phép các cuộc tấn công giữa người).

Nói chung, có khả năng bạn sẽ phải hiểu các nguyên tắc của SSL, bất kể bạn sử dụng thư viện nào. Các giải pháp thay thế thư viện là OpenSSL (cả Unix và Windows) và SChannel (chỉ Windows).

2

Bạn đã thử hỗ trợ SSL trong Boost.Asio hoặc ACE? Cả hai đều sử dụng OpenSSL dưới sự giám sát và cung cấp các trừu tượng tương tự cho TCP, UDP và SSL. Mã mẫu có sẵn trong cả bản phân phối Boost.Asio và ACE.

Một điều bạn có thể cần lưu ý là SSL có định hướng ghi thay vì hướng luồng (cả TCP và UDP). Điều này có thể ảnh hưởng đến cách bạn multiplex sự kiện kể từ khi bạn phải, ví dụ, đọc bản ghi SSL đầy đủ trước khi bạn có thể gọi một hoạt động đọc hoàn thành.

2

Để giúp xử lý việc này mà không có thay đổi đối với ứng dụng, bạn có thể muốn xem dự án stunnel (http://www.stunnel.org/). Tôi không nghĩ rằng nó sẽ xử lý UDP cho bạn mặc dù.

2

Thư viện SSL/TLS được nhúng yaSSL và CyaSSL đã hoạt động tốt cho tôi trong quá khứ. Được nhắm mục tiêu vào các hệ thống nhúng, chúng được tối ưu hóa cho cả tốc độ và kích thước. yaSSL được viết bằng C++ và CyaSSL được viết bằng C. Trong khi đó, CyaSSL có thể nhỏ hơn 20 lần so với OpenSSL.

Cả hai đều hỗ trợ các tiêu chuẩn ngành mới nhất (lên tới TLS 1.2), cung cấp một số tính năng thú vị như mật mã dòng và được cấp phép kép theo GPLv2 và giấy phép thương mại (nếu bạn cần hỗ trợ thương mại).

Họ có một hướng dẫn SSL mà chạm vào thêm CyaSSL vào mã tồn tại từ trước của bạn cũng như: http://www.yassl.com/yaSSL/Docs-cyassl-manual-11-ssl-tutorial.html

Trang sản phẩm: http://yassl.com/yaSSL/Products.html

Kính trọng,
Chris

+0

Xin chào Chris, cảm ơn câu trả lời. Thật không may, hơn một năm đã trôi qua kể từ khi tôi đăng bài, và khách hàng đã hủy bỏ dự án và ném tôi ra khỏi dự án một vài tuần trước. –

+0

Rất tiếc khi nghe. Tôi đã nhận ra rằng nó đã được một thời gian dài kể từ khi bạn gửi bài, nhưng tôi nghĩ ít nhất là đăng bài vì lợi ích tham khảo trong tương lai. – Chrisc

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