Я недавно использовал SSL-сокеты для системы обмена сообщениями.Нет наборов шифров в общих сокетах Java
Я наконец начал использовать сертификат, выданный СА. Я импортировал его в свое хранилище ключей, установил свойство хранилища ключей и запустил мой клиент, но при попытке отправить данные я все время получаю исключения для рукопожатия.
Я включил режим отладки, и я обнаружил, что это связано с no cipher suites supported
. Любые мысли по этому поводу?
Если это помогает, в нем также говорится, что он игнорирует около 10 наборов шифров от TLSV1 и TLSV1.1.
Я также установил криптографическую политику неограниченной силы.
Клиентский код
public static void Message(String args){
System.setProperty("https.protocols", "TLSv1");
System.setProperty("javax.net.debug", "all");
try
{
String host = "localhost";
int port = 3498;
InetAddress address = InetAddress.getByName(host);
socket = (SSLSocket)SSLSocketFactory.getDefault().createSocket(address, port);
//Send the message to the server
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
String number = "Hello from the other side!";
String sendMessage = number + "\n";
bw.write(args);
bw.flush();
System.out.println("Message sent to the server : "+sendMessage);
//Get the return message from the server
}
catch (Exception exception)
{
exception.printStackTrace();
}
finally
{
//Closing the socket
try
{
socket.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
Серверный код
private void initListen() {
System.setProperty("javax.net.ssl.keyStore", "/Users/181095/server.jks");
try {
SSLServerSocketFactory sf = (SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
SSLServerSocket serverSocket = (SSLServerSocket)sf.createServerSocket(Ting.port);
System.out.println("Server Started and listening to the port "
+ Ting.port);
// Server is running always. This is done using this while(true)
// loop
while (true) {
// Reading the message from the client
socket = (SSLSocket)serverSocket.accept();
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String input = br.readLine();
System.out.println("Message received from client is " + input);
/*if(PacketReader.isPacket(input)){
if(PacketReader.shouldSendDataBack(input)){
}
}*/
/*
*
* if client has data waiting or client has new data
* request new data.
* else, wait 5 seconds and repeat
*
*
*/
// Sending the response back to the client.
/*OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
bw.write("");*/
//TODO Implement method to send this data to client storage data.
//bw.flush();
}
//Check for exceptions and try to close the socket.
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (Exception e) {
}
}
}
Edit: Я просто добавил пароль, но мой вход/сертификат не имеет ключа, может это будет способствовать ошибке? Как я могу это исправить?
Я сделал это, но он все еще не работает, потому что я получил от внешнего источника, мне нужно установить ключ, потому что, используя keytool, он не может найти ключ. Нужно ли мне генерировать ключ? –
Вы не можете «получить [сертификат] из внешнего источника» и использовать его как свой собственный сертификат. Вы должны начать с создания пары ключей, затем с помощью CSR, затем ее подписать, а затем импортировать подписанный сертификат в одно хранилище ключей с тем же псевдонимом и без опции '-trustcacerts'. – EJP
Хорошо, поэтому я использовал SSL с моего сайта. Мой сайт использует SSL. Я загрузил SSL-сертификат из созданного CSR. Это было сделано через NameCheap, и я считаю, что они делают это через Comodo SSL. Я не верю, что он пришел с ключом, когда я использую keytool на нем, он говорит, что нет ключа. Что здесь происходит? –