Обеспечение правильной настройки HTTPS-соединения. - PullRequest
0 голосов
/ 04 июня 2018

Согласно Android-документации :

Предполагая, что у вас есть веб-сервер с сертификатом, выданным известным центром сертификации, вы можете сделать безопасный запрос с помощью простого кодаэто:

URL url = new URL("https://wikipedia.org");
URLConnection urlConnection = url.openConnection();
InputStream in = urlConnection.getInputStream();
copyInputStreamToOutputStream(in, System.out);

Да, это действительно может быть так просто.

В настоящее время я работаю над проектом Android и теперь хочу начать внедрение пользовательской системы (база данных пользователей / паролей, возможности регистрации / входа и т. Д.).

ЗдесьВот как мы сейчас работаем с соединением (в разделе Android проекта):

package com.example.payne.simpletestapp;


import org.osmdroid.util.BoundingBox;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;


public class ServerConnection {

    public String serverAddress;
    public int port;

    public ServerConnection(String addr, int port){
        this.serverAddress = addr;
        this.port = port;

    }

    public ServerConnection(String addr){

        this.port = 80;
        this.serverAddress = addr;

    }

    /**
     * Envoie une requête au serveur de façon périodique.
     * <p></p>
     * Reçoit toutes les alertes sur le territoire
     *
     * @return
     */
    public String ping(BoundingBox boundingBox) throws Exception {

        String param =
            "?nord=" + boundingBox.getLatNorth() +
            "&sud=" + boundingBox.getLatSouth() +
            "&est=" + boundingBox.getLonEast() +
            "&ouest=" + boundingBox.getLonWest();

        return this.getRequest("/alertes", param);

    }


    public String getRequest(final String path, final String param) throws Exception {

        final Response result = new Response();

        Thread connection = new Thread(new Runnable() {

            @Override
            public void run() {

                try{
                    URL obj = new URL(serverAddress + path + param);
                    HttpURLConnection con = (HttpURLConnection) obj.openConnection();

                    // optional default is GET
                    con.setRequestMethod("GET");
                    // int responseCode = con.getResponseCode();

                    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
                    String inputLine;
                    StringBuffer response = new StringBuffer();

                    while ((inputLine = in.readLine()) != null) {
                        response.append(inputLine);
                    }

                    in.close();

                    result.response = response.toString();

                } catch (Exception e){
                    e.printStackTrace();
                }
            }
        });

        connection.start();
        connection.join();


        return result.response;

    }

    public Boolean postAlert(Alerte alerte) {

        boolean success = false;
        alerte.log();

        String param =  "?type=" + alerte.type +
                        "&lat=" + alerte.getLatitude() +
                        "&lng=" + alerte.getLongitude();

        try {
            this.getRequest("/putAlert", param);
            success = true;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return success;

    }


}

Обратите внимание, что в другом месте другой член команды, похоже, устанавливает соединения по-другому (в разделе «бэкэнд»).проекта, который используется сервером, а не обязательно Android):

private String getRssFeed() {
    try {
        String rss = "";
        URL rssSource = new URL("https://anURLwithHTTPS.com/");
        URLConnection rssSrc = rssSource.openConnection();
        BufferedReader in = new BufferedReader(
                new InputStreamReader(
                        rssSrc.getInputStream(), StandardCharsets.UTF_8));
        String inputLine;

        while ((inputLine = in.readLine()) != null) {
            rss += inputLine;
        }

        in.close();

        String rssCleaned = rss.replaceAll("&lt;", "<").replaceAll("&gt;", ">").substring(564);

        return rssCleaned;
    } catch (MalformedURLException ex) {
        Logger.getLogger(AlertesFluxRss.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(AlertesFluxRss.class.getName()).log(Level.SEVERE, null, ex);
    }
    return "";
}

Вопросы:

  1. Будет ли первый представленный код (связанный с Android)1) использовать зашифрованное соединение (HTTPS)?
  2. Как насчет второго?
  3. Как мы можем проверить, была ли отправленная информация зашифрована?
  4. Передается ли наHttpURLConnection это угроза?Кажется, в документации указывается, что он автоматически преобразуется в «HttpsURLConnection».
  5. Поскольку HttpsURLConnection расширяет HttpURLConnection, он имеет все возможности HttpURLConnection и более, верно?

Я нашел это , но это было не совсем то, что я искал.

Нашей текущей идеей для регистрации новых пользователей будет отправка их информации в URL через зашифрованное соединение (по линииhttps://myWebsite.com/api/?user=Bob&pass=amazing) на сервер (размещен на https://www.heroku.com).

Если есть более эффективные способы сделать такую ​​вещь, пожалуйста, дайте мне знать. Предложения будут с удовольствием рассмотрены. Я не слишком осведомленкогда дело доходит до библиотек, так что, пожалуйста, поделитесь всем, что вы знаете, что может сделать мой подход более безопасным и быстрым для реализации.

Большое спасибо за вашу помощь заранее! :)

1 Ответ

0 голосов
/ 04 июня 2018

Будет ли первый представленный код (связанный с Android) использовать зашифрованное соединение (HTTPS)?

Не без просмотра URL, который использует «представленный первый код», который нене показано.В указанном вами примере Android строка URL "https://wikipedia.org" гарантирует это по определению.Если он начинается с https:, он использует HTTPS, который зашифрован: в противном случае, он не делает и не делает.

А как насчет второго?

Да, по вышеуказанной причине.

Как мы можем проверить, была ли отправленная информация зашифрована?

Нет.Вы используете https: URL.Остальное автоматическое.Оно работает.Работал 22 года.Тестирование не требуется.Не проверяйте платформу.Если вы должны это проверить, попытайтесь типизировать до HttpsURLConnection.Если это HTTPS, это будет успешно: в противном случае произойдет сбой.

Является ли приведение к HttpURLConnection угрозой?

Нет.Я не понимаю, почему вы спрашиваете.

Документация, кажется, указывает, что она автоматически преобразуется в "HttpsURLConnection".

Нет, это не так.Это указывает, что HttpsURLConnection является созданным .Нет литья.

Поскольку HttpsURLConnection расширяет HttpURLConnection, он обладает всеми возможностями HttpURLConnection и более, верно?

Верно.

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