Войти на сайт HTTPS с Java - PullRequest
       0

Войти на сайт HTTPS с Java

0 голосов
/ 18 марта 2012

Я пытаюсь создать программу на Java, которая автоматически подключается к веб-сайту по протоколу https. Я просто хочу ввести свое имя и пароль в мою прогу, нажать «Отправить» и получить страницу, которая появится, если я сделаю это в браузере.

Я уже написал программу, которая показывает HTML-код сайта, используя класс SSLSocket.

import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.Scanner;

import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;

public class bankpost{
    public static void main(String[] args) throws UnsupportedEncodingException {
    final String page = "banking.postbank.de";
    SSLSocketFactory sf = (SSLSocketFactory) SSLSocketFactory.getDefault();
    try {
        SSLSocket s = (SSLSocket) sf.createSocket(page, 443);

        Scanner in = new Scanner(s.getInputStream());
        PrintWriter out = new PrintWriter(s.getOutputStream(), true);

        System.out.println("Sending request to server "
                + s.getInetAddress());
        out.print("POST /rai/login HTTP1.1\r\n\r\n");
        String content = "nutzername=a&kennwort=a";
        String cmd = "POST /rai/login HTTP/1.1\n"
                + "Host: banking.postbank.de\n"
                + "Content-Type: application/x-www-form-urlencoded\n"
                + "Content-Length: " + content.length() + "\n\n"
                + content + "\r\n\r\n";
        out.print(cmd);
        out.flush();
        in.useDelimiter(">");
        System.out.println("Reading...");
        int len = 0;
        while (in.hasNext()) {
            String line = in.next();
            len += line.length();
            if (line.contains("field-input") || line.contains("nicht"))
                System.err.println(line.trim());
            else
                System.out.println(line.trim());
        }

        System.out.println("DONE - " + len);
        System.out.print(cmd);
        in.close();
        out.close();
        s.close();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

... поля, в которые я хочу поместить данные, это "nutzername" и "kennwort".

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 18 марта 2012

Я бы попробовал стандартную магию HttpsConnection. SSL требует сертификатов и доверительных менеджеров, которые будут установлены правильно. Инициализируйте HttpsContext следующим образом:

    SSLContext sc = SSLContext.getInstance("SSL");
    // here you may want to call sc.init() with your key managers and trustmanagers 
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    HttpsURLConnection.setDefaultHostnameVerifier(verifier);
    HttpsURLConnection.setFollowRedirects(false);

    //setting authenticator which will push your credentials to the server when required
    Authenticator.setDefault(new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(config.getUserName(), config.getPassword().toCharArray());
        }
    })

где верификатор является классом-потомком, реализующим интерфейс HostnameVerifier и принимающим URL сайта, с которым вы работаете.

После того, как контекст установлен, вы просто работаете с новым URL (). GetConnection (), как и для любых других простых сайтов http.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...