Pracuję nad projektem, do którego chcę dodać protokół SSL, dlatego utworzyłem prostą implementację testu klient/serwer, aby sprawdzić, czy zadziałało i otrzymałem wyjątek NoSuchAlgorithmException. Poniżej zamieszczona jest mój kod serwera, który rzuca wyjątek:Wyrzucanie kodu SSL Java NoSuchAlgorithException
import java.io.*;
import java.net.*;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import javax.net.ssl.*;
public class SslServer
{
private static final int PORT = 5555;
public static void main(String[] args)
{
SecureRandom sr = new SecureRandom();
sr.nextInt();
try {
//client.public is the keystore file that holds the client's public key (created with keytool)
KeyStore clientKeyStore = KeyStore.getInstance("JKS");
clientKeyStore.load(new FileInputStream("client.public"), "clientpublicpw".toCharArray());
//server.private is the key pair for the server (created with keytool)
KeyStore serverKeyStore = KeyStore.getInstance("JKS");
clientKeyStore.load(new FileInputStream("server.private"), "serverprivatepw".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(clientKeyStore);
//This next line is where the exception occurs
KeyManagerFactory kmf = KeyManagerFactory.getInstance("TLS");
kmf.init(serverKeyStore, "serverprivatepw".toCharArray());
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), sr);
SSLServerSocketFactory sf = sslContext.getServerSocketFactory();
SSLServerSocket ss = (SSLServerSocket)sf.createServerSocket(SslServer.PORT);
ss.setNeedClientAuth(true);
BufferedReader in = new BufferedReader(new InputStreamReader(ss.accept().getInputStream()));
String line = null;
while((line = in.readLine()) != null)
{
System.out.println(line);
}
in.close();
ss.close();
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
}
}
StackTrace pojawia się:
java.security.NoSuchAlgorithmException: TLS KeyManagerFactory not available
at sun.security.jca.GetInstance.getInstance(Unknown Source)
at javax.net.ssl.KeyManagerFactory.getInstance(Unknown Source)
at SslServer.main(SslServer.java:32)
Próbowałem zastępując „TLS” z „SSL” i nadal mam ten sam wyjątek. To nie miało dla mnie sensu. W jaki sposób protokół TLS i SSL mogą nie być obsługiwane? To jest mój pierwszy raz, kiedy próbuję implementować SSL i wydaje się, że trudno jest znaleźć dobre zasoby na ten temat za pomocą przykładów kodu, które są dobrze wyjaśnione. Czy ktoś może mi powiedzieć, dlaczego otrzymuję ten wyjątek lub wskazuje coś nie tak z moim kodem?
k Edytowałem mój wpis, aby dodać tę zmianę. Nadal mam ten sam wyjątek, nawet jeśli używam "TLS" – MattL922
Jeśli naprawdę martwisz się hasłami, powinieneś użyć 'char []' bezpośrednio lub jako hasło zwrotne i nigdy nie zakodowuj swojego hasła w prawdziwa aplikacja (patrz http://stackoverflow.com/a/8889285/372643). – Bruno
Na marginesie czekanie, aż 'readLine' zwróci' null', nie jest dobrym sposobem, aby wiedzieć, kiedy przerwać czytanie (z dowolnego rodzaju gniazda), zobacz dyskusję tutaj: http://stackoverflow.com/a/6425509/372643 – Bruno