Как прочитать данные через 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());
            }
        } 
    }
}
→ Ссылка