Java アプリケーションを開発しており、Secure Sockets を介してサーバーにいくつかの文字列 (ユーザーとパスワード) を送信する必要があります。信頼できる CA によって生成された独自の証明書を使用する必要がありますが、例外が発生します。
サーバ
class LoginServer {
private static final String CORRECT_USER_NAME = "Java";
private static final String CORRECT_PASSWORD = "HowToProgram";
private SSLServerSocket serverSocket;
public LoginServer() throws Exception {
SSLServerSocketFactory socketFactory = (SSLServerSocketFactory) SSLServerSocketFactory
.getDefault();
serverSocket = (SSLServerSocket) socketFactory.createServerSocket(7070);
}
private void runServer() {
while (true) {
try {
System.err.println("Waiting for connection...");
SSLSocket socket = (SSLSocket) serverSocket.accept();
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter output = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
String userName = input.readLine();
String password = input.readLine();
if (userName.equals(CORRECT_USER_NAME) && password.equals(CORRECT_PASSWORD)) {
output.println("Welcome, " + userName);
} else {
output.println("Login Failed.");
}
output.close();
input.close();
socket.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}
public static void main(String args[]) throws Exception {
LoginServer server = new LoginServer();
server.runServer();
}
}
クライアント
class LoginClient {
public LoginClient() {
try {
SSLSocketFactory socketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) socketFactory.createSocket("localhost", 7070);
PrintWriter output = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
String userName = "MyName";
output.println(userName);
String password = "MyPass";
output.println(password);
output.flush();
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String response = input.readLine();
System.out.println(response);
output.close();
input.close();
socket.close();
} catch (IOException ioException) {
ioException.printStackTrace();
} finally {
System.exit(0);
}
}
public static void main(String args[]) {
new LoginClient();
}
}
これは、出力ウィンドウの結果です。
javax.net.ssl.SSLHandshakeException: no cipher suites in common
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1886)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:266)
at sun.security.ssl.ServerHandshaker.chooseCipherSuite(ServerHandshaker.java:894)
at sun.security.ssl.ServerHandshaker.clientHello(ServerHandshaker.java:622)
at sun.security.ssl.ServerHandshaker.processMessage(ServerHandshaker.java:167)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:882)
at sun.security.ssl.AppInputStream.read(AppInputStream.java:102)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.readLine(BufferedReader.java:317)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at zzzz.LoginServer.runServer(LoginServer.java:35)
at zzzz.LoginServer.main(LoginServer.java:55)
あなたが私を助けてくれることを願っています。
どうもありがとう