2009-05-15 28 views
13

Lý tưởng nhất, tôi chỉ cần đơn giản SSLSocketChannel.SSL và SocketChannel

Tôi đã có một thành phần đọc và viết tin nhắn thông thường SocketChannel, nhưng đối với một số kết nối này, tôi phải sử dụng SSL qua dây; các hoạt động trên các kết nối này, tuy nhiên, là như nhau.

Có ai biết được việc thực hiện SSLSocketChannel miễn phí (với bộ chọn thích hợp) hay tương tự không? Tôi đã tìm thấy this, nhưng bộ chọn không chấp nhận nó vì nhà cung cấp của nó không phải là SUN.

Tôi đang tách logic đọc_from/writing_to khỏi chèn và truy xuất dữ liệu mạng qua một đối tượng đơn giản, để sử dụng SSLEngine mà không bị điên, nhưng thực sự khó thực hiện điều đó một cách chính xác, Tôi không biết nội bộ của giao thức SSL ...

Trả lời

0

Kiểm tra triển khai của Restlet có thể làm những gì bạn cần và tất cả là về NIO.

Restlet Engine Javadoc

Cụ thể là HttpClientCall. SetProtocol (HTTPS) - getResponseEntityChannel trả về một ReadableByteChannel (getEntityChannel trả về một WriteableByteChannel)

+0

Cảm ơn, tôi sẽ cung cấp cho nó một cái nhìn :) – akappa

+0

Mmh, tôi đã tìm kiếm trong các nguồn cho "SSLEngine" và I'vent tìm thấy bất cứ điều gì ... có lẽ họ không sử dụng nonblocking I/O với SSL? – akappa

+0

Tôi nghi ngờ nó - toàn bộ dự án Restlet dựa trên NIO. Xin lỗi không thể giúp đỡ nhiều hơn, nhưng tôi phải tin rằng họ có một giải pháp SSL NIO ở đâu đó. – Gandalf

0

Không chắc chắn nếu đây là những gì bạn đang tìm kiếm, nhưng có thể giúp ... Để tạo ổ cắm máy chủ hỗ trợ SSL/TLS, tôi hiện đang sử dụng mã như sau (keystore.jks chứa cặp khóa công khai/riêng tư được sử dụng để bảo mật xác nhận) - khách hàng có kho lưu trữ tin cậy tương tự chứa chứng chỉ đã ký bằng khóa công cộng của cặp đó.

Một chút googling xung quanh nhận được rằng cấu hình sẽ giúp bạn tiến hành.

String keyStorePath = "keystore.jks"; 
String keyStorePassword = "password"; 

KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
KeyStore keyStore = new KeyStore(); 
keyStore.load(new FileInputStream(keyStorePath), keyStorePassword); 
keyManagerFactory.init(keyStore, keyStorePassword.toCharArray()); 

sslContext = SSLContext.getInstance("TLS"); 
sslContext.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom()); 

SSLContext sslContext = getServerSSLContext(namespace.getUuid()); 
SSLServerSocketFactory serverSocketFactory = sslContext.getServerSocketFactory(); 

// Create sockets as necessary 
+3

Có lẽ nó không rõ ràng từ câu hỏi, nhưng tôi có một thành phần không chặn I/O, vì vậy tôi muốn một ổ cắm SSL không chặn (trong Java, một ổ cắm không chặn được gọi là "kênh"). Với cách tiếp cận của bạn, bạn có một Socket chặn mã hóa dữ liệu thông qua SSL/TLS, vì vậy nó không phải là những gì tôi đang tìm kiếm. Tôi sử dụng cách tiếp cận đó trong một thành phần khác, nơi tôi có thể đủ khả năng chi phí để có một luồng cho mỗi kết nối. Cảm ơn bạn đã dành thời gian cho bạn! – akappa

+0

Tôi đã xem xét việc thực hiện điều gì đó tương tự gần đây và thực sự đã kết thúc các công cụ quyết định như http://www.jboss.org/netty và http://mina.apache.org là một cách tiếp cận dễ dàng hơn để thêm SSL vào NIO. Có các cơ chế để sử dụng NIO thông qua Công cụ SSL mà bạn có thể nhận được từ SSLContext, nhưng nhìn vào mã mẫu có sẵn, nó chỉ quá khó khăn! [nguyên tắc của tôi là nếu tôi cần tải xuống mã ZIP của mã nguồn cho hướng dẫn (thay vì hiển thị nội tuyến) thì đã đến lúc tìm kiếm các lựa chọn thay thế ...] – Martin

5

Cầu cảng có triển khai SSL NIO cho máy chủ: SslSelectorChannelConnector. Bạn có thể muốn nhìn vào nó để biết chi tiết về những gì nó đang làm.

Ngoài ra còn có một bài viết cũ (nhưng phong nha) từ O'Reilly giải thích chi tiết về NIO + SSL cùng với mã ví dụ.

+1

Cảm ơn những gợi ý :) Tôi đã biết bài viết của O'Reilly, nhưng nó hơi quá đơn giản. Tôi đã tìm thấy một gợi ý rất tốt về việc xây dựng một cái gì đó tương tự như một SSLSocketChannel trong cuốn sách "Mạng cơ bản trong Java" của Esmond Pitt, nhưng nó vẫn là một nỗi đau trong một ** có được nó corretly;) – akappa

1

TLS Channel là một thư viện đơn giản mà thực hiện chính xác rằng: gói một SSLContext (hoặc SSLEngine) và phơi bày một giao diện ByteChannel, làm việc nặng nhọc trong nội bộ.

(Tuyên bố từ chối trách nhiệm: Tôi là tác giả chính của thư viện).

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