2014-07-21 34 views
5

Opracowałem aplikację działającą z gniazdami TCP.Jak sprawić, aby TLS działał z java?

Teraz chciałbym, aby działało z połączeniem TLS.

Przeszukałem niektóre zasoby na 2 dni, ale nie ma nic, co wyglądałoby jak samouczek na temat implementacji TLS.

Oto co zrozumiałem z tego, co mam zrobić:

  • muszę zaimportować główny CA w moim kluczy.
  • Muszę zaimportować inne certyfikaty do mojego magazynu kluczy/zaufanych certyfikatów.

Nie mogę znaleźć czytelnej próbki kodu, która naprawdę wyjaśni, co należy zrobić.

Czy możesz mi pomóc z przykładem klienta/serwera lub innym pomocnym samouczkiem? (Próbowałem już wyszukać "TLS Java", "Przykład TLS Java", "Samouczek TLS Java" .... Ale nie mogłem znaleźć niczego satysfakcjonującego.)

Z góry dziękuję za uwagę.

+0

Czy pytanie konkretnie o TLS (w przeciwieństwie do SSL)? Czy próbujesz wdrożyć SSL/TLS samodzielnie, czy chcesz włączyć to, co już jest w JSSE dla twojej aplikacji? – Bruno

+0

Chciałbym wdrożyć to, co już jest w JSSE. – Kaijiro

+0

Aby wyjaśnić, przypuszczalnie przez to rozumiesz * używaj * tego, co już jest w JSSE, a nie * ponownie wdrażaj * co jest w JSSE? – Bruno

Odpowiedz

13

Można to osiągnąć na dwa sposoby.

Najłatwiejszy z nich to obsługa protokołu Java i obiekt URL.

Ale ponieważ myślę, że już zorientowali się, że new URL("https://www.google.com").openStream() daje jasny strumień wejściowy tekst natomiast do czynienia z wszystkimi rzeczami TLS/SSL dla ciebie, pójdę do „twardych” sposób :)

Wystarczy zanim odpowiem na twoje drugie pytanie: importowanie CA. certyfikaty CA znajdują się w domu java na albo tez lokalizacjach: $JAVA_HOME/lib/security/cacerts (JRE) lub $JAVA_HOME/jre/lib/security/cacerts (JDK; zauważy „jre” tuż po domu Java) zarówno domyślne hasło to „changeit”

Aby Lista jego zawartość można użyć keytool polecenie:

$ keytool -list -keystore cacerts -storepass changeit 

Aby dodać nową cert wystarczy użyć -import komendy zamiast -list

Więc teraz chodźmy na „twarde” way (kod klienta):

import javax.net.SocketFactory; 
import javax.net.ssl.SSLSocketFactory; 
... 
String host = "www.google.com"; 
int port = 443; 
SocketFactory basicSocketFactory = SocketFactory.getDefault(); 
Socket s = basicSocketFactory.createSocket(host,port); 
// s is a TCP socket 
SSLSocketFactory tlsSocketFactory = SSLSocketFactory.getDefault(); 
s = tlsSocketFactory.createSocket(s, host, port, true); 
// s is now a TLS socket over TCP 

To takie proste.

Jeśli potrzebujesz gniazda serwera kodu jest prawie taki sam, po prostu trzeba wymieniać SocketFactory dla ServerSocketFactory i SSLSocketFactory dla SSLServerSocketFactory

nadziei, że to pomoże

+0

W środowisku JRE7 nie ma pliku ani folderu o nazwie truststore. Czy powinienem je stworzyć, czy to zrobić za pomocą Keytool? – Kaijiro

+0

Przepraszam, Kaijiro, napisałem odpowiedź z pamięci, nazwa pliku to 'cacerts' nie -truststore- poprawię odpowiedź – Cerber

Powiązane problemy