Tôi đang làm việc trên một dự án mà tôi muốn thêm SSL vào, vì vậy tôi đã tạo một thử nghiệm máy chủ/máy khách đơn giản để xem nó có hoạt động hay không và tôi nhận được NoSuchAlgorithmException. Sau đây là mã máy chủ của tôi mà là ném ngoại lệ:Mã Java SSL ném 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();
}
}
}
các stacktrace tôi nhận được là:
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)
tôi đã cố gắng thay thế "TLS" với "SSL" và tôi vẫn có những ngoại lệ như vậy. Điều đó không có ý nghĩa với tôi. TLS và SSL không được hỗ trợ như thế nào? Đây là lần đầu tiên tôi thử triển khai SSL và có vẻ như khó tìm được tài nguyên tốt về điều này với các ví dụ mã được giải thích rõ ràng. Bất cứ ai có thể cho tôi biết lý do tại sao tôi nhận được ngoại lệ này hoặc chỉ ra một cái gì đó sai trái với mã của tôi?
k tôi đã chỉnh sửa bài đăng của mình để thêm thay đổi đó. Tôi vẫn nhận được cùng một ngoại lệ ngay cả khi tôi sử dụng "TLS" – MattL922
Nếu bạn đang thực sự lo lắng về mật khẩu, bạn nên sử dụng một 'char []' trực tiếp hoặc như gọi lại mật khẩu, và không bao giờ mã hóa mật khẩu của bạn anyway trong một ứng dụng thực (xem http://stackoverflow.com/a/8889285/372643). – Bruno
Là một lưu ý phụ, chờ 'readLine' trả về' null' không phải là cách hay để biết khi nào nên dừng đọc (từ bất kỳ loại socket nào), hãy xem thảo luận tại đây: http://stackoverflow.com/a/6425509/372643 – Bruno