Как прочитать данные через SSL сокеты
Я хочу прочитать данные с сервера, соединение с которым защищено SSL, и попробовать реализовать long polling dos атаку. Как правильно общаться с сервером через SSL сокеты? Вот этот код ничего не получает от сервера (для примера взят вк).
package socket;
import javax.net.ssl.SSLSocketFactory;
import java.io.IOException;
import java.util.Scanner;
public class Main
{
private final static String target = "vk.com";
public static void main(String[] args) throws IOException
{
System.setProperty("javax.net.ssl.keyStore", "/home/aoizora/keystore.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "changeit");
try (var s = (SSLSocket) SSLSocketFactory.getDefault().createSocket(target, 443);
var in = new Scanner(s.getInputStream());
var out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream()))))
{
s.startHandshake();
out.print("GET / HTTP/1.1\r\n");
out.write(String.format("Host: %s", target));
out.println();
while (in.hasNextLine())
{
System.out.println(in.nextLine());
}
}
}
}
Сертификат SSL сгенерировал и подключил, не помогло
System.setProperty("javax.net.ssl.keyStore", "/home/aoizora/keystore.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "changeit");
Ответы (1 шт):
Автор решения: Pak Uula
→ Ссылка
У вас в коде две проблемы - нет пустой строки после заголовка Host, и вы не сбрасываете буфер (aka out.flush()) после завершения вывода в сокет.
Вот рабочий пример:
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Scanner;
public class Main
{
private final static String target = "vk.com";
public static void main(String[] args) throws IOException
{
try (var s = (SSLSocket) SSLSocketFactory.getDefault().createSocket(target, 443);
var in = new Scanner(s.getInputStream());
var out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream()))))
{
System.out.println("Start handshake");
s.startHandshake();
System.out.println("Handshake done");
out.print("GET / HTTP/1.1\r\n");
out.write(String.format("Host: %s\r\n", target));
out.print("\r\n");
out.flush();
System.out.println("Request done");
while (in.hasNextLine())
{
System.out.println(in.nextLine());
}
}
}
}