2012-09-11 25 views
8

Chcę otworzyć gniazdo bezpiecznego nasłuchiwania w aplikacji serwera Java. Wiem, że zalecanym sposobem, aby to zrobić, to po prostu to zrobić:Ustawianie certyfikatu używanego przez serwer Java SSL ServerSocket

SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); 
ServerSocket ss = ssf.createServerSocket(443); 

Wymaga to jednak zdać certyfikat serwera do JVM podczas uruchamiania Java. Ponieważ to sprawiłoby, że pewne rzeczy we wdrażaniu byłyby dla mnie bardziej skomplikowane, wolałbym załadować certyfikat w czasie wykonywania.

Mam zatem plik klucza i hasło i chcę gniazdo serwera. Jak się tam dostanę? Cóż, zapoznać się z dokumentacją, a jedynym sposobem udało mi się znaleźć to:

// these are my parameters for SSL encryption 
char[] keyPassword = "[email protected]!".toCharArray(); 
FileInputStream keyFile = new FileInputStream("ssl.key"); 

// init keystore 
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
keyStore.load(keyFile, keyPassword); 
// init KeyManagerFactory 
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
keyManagerFactory.init(keyStore, keyPassword); 
// init KeyManager 
KeyManager keyManagers[] = keyManagerFactory.getKeyManagers(); 
// init the SSL context 
SSLContext sslContext = SSLContext.getDefault(); 
sslContext.init(keyManagers, null, new SecureRandom()); 
// get the socket factory 
SSLServerSocketFactory socketFactory = sslContext.getServerSocketFactory(); 

// and finally, get the socket 
ServerSocket serverSocket = socketFactory.createServerSocket(443); 

I to nawet nie ma żadnej obsługi błędów. Czy to naprawdę takie skomplikowane? Czy nie ma prostszego sposobu na zrobienie tego?

+1

To pytanie dotyczy problemu z ustawieniem certyfikatu. Twój tytuł tego nie podkreślił (a jedyna dotychczasowa odpowiedź najwyraźniej pomijała tę kwestię), więc skorzystałem z możliwości jej zmiany. Proszę poprawić tytuł dalej, jeśli chcesz. –

+0

Myślę, że kod, który do tej pory wymyśliłeś, jest (a) przerażający i (b) bardzo prawdopodobne, że jest to "właściwy" sposób na zrobienie tego. Java nie zawsze jest przesadnie gadatliwa, ale kiedy jest, jest naprawdę zbyt gadatliwa. –

+0

Jeśli uważasz, że to skomplikowane, spróbuj zrobić to z NIO. –

Odpowiedz

9

Ale to wymaga przekazania certyfikatu serwera do JVM podczas uruchamiania java.

Nie, nie ma. Wystarczy ustawić te właściwości systemu przed utworzeniem SSLServerSocket:

javax.net.ssl.keyStore ssl.key 
javax.net.ssl.keyStorePassword [email protected]! 

można zrobić z System.setProperties()lub w wierszu poleceń.

2

Jeśli spojrzysz na kod, możesz zobaczyć, dlaczego jest to bardzo skomplikowane. Ten kod oddziela wdrożenie protokołu SSL z:

  • źródle materiału klucza (KeyStore)
  • certyfikatu wyboru algorytmu i zarządzania kluczami (KeyManager)
  • zarządzania zasadami wzajemnej Trust (TrustManager) - nie używane tutaj
  • bezpieczny algorytm losowy (SecureRandom)
  • NIO lub wdrożenie gniazdo (SSLServerSocketFactory) - przydałby SSLEngine dla NIO

Zastanów się, jak mogłaby wyglądać Twoja własna realizacja, gdybyś próbował osiągnąć te same cele!

+0

Ale używam domyślnego dla wszystkich tego. Powinien istnieć prostszy sposób. – Philipp

+0

@Philipp Brak domyślnego magazynu kluczy. – EJP

Powiązane problemy