2011-12-08 11 views
8

Tôi muốn ứng dụng của mình nói chuyện với máy chủ mà không cần mã hóa trước khi phát hành STARTTLS và sau đó nâng cấp ổ cắm được mã hóa sau đó. Tôi có thể kết nối với một cổng (ví dụ: 5222) và sử dụng STARTTLS để yêu cầu TLS sử dụng java không? Nếu vậy, đối tượng Socket nào tôi nên sử dụng cho điều đó?Nâng cấp ổ cắm Java để mã hóa sau starttls

Trả lời

9

Chắc chắn bạn có thể. Sử dụng SSLSocketFactory của bạn để tạo ra một ổ cắm gói một java.net.Socket thông thường có sẵn:

SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(
     socket, 
     socket.getInetAddress().getHostAddress(), 
     socket.getPort(), 
     true); 
5

@ câu trả lời của Jan là hữu ích (và tôi đã bỏ phiếu cho nó), nhưng tôi đã phải tinh chỉnh nó một chút để có được nó làm việc cho tôi:

SSLSocket sslSocket = (SSLSocket) ((SSLSocketFactory) SSLSocketFactory.getDefault()).createSocket(
         socket, 
         socket.getInetAddress().getHostAddress(), 
         socket.getPort(), 
         true); 
InputStream inputStream = sslSocket.getInputStream(); 
OutputStream outputStream = sslSocket.getOutputStream(); 
// reads from the socket 
Scanner scanner = new Scanner(inputStream); 
// writes to the socket 
OutputStream outputStream = new BufferedOutputStream(outputStream); 

Thử nghiệm với Java 7 và GMail (smtp.gmail.com) trên cổng 587.

1

Dưới đây là một sự cải thiện khả năng: Nếu mã của bạn là dành cho phía máy chủ thay vì phía khách hàng, thêm này, và nó sẽ hoạt động tốt:

sslsocket.setUseClientMode(false); 
sslsocket.startHandshake();