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?
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. –
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. –
Jeśli uważasz, że to skomplikowane, spróbuj zrobić to z NIO. –