确保正确设置HTTPS连接

时间:2018-06-03 21:29:21

标签: java android https

根据Android Documentation

  

假设您的Web服务器具有由知名CA颁发的证书,您可以使用以下代码进行安全请求:

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;

    }


}

请注意,在其他地方,团队的其他成员似乎已经建立了不同的连接(在项目的后端&#39;部分,服务器使用,而不一定是Android):< / p>

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相关的代码)是否会使用加密连接(HTTPS)?
  2. 第二个怎么样?
  3. 我们如何测试发送的信息是否已加密?
  4. 向HttpURLConnection施放威胁?文档似乎表明它将自动重新编入&#34; HttpsURLConnection&#34;。
  5. 由于HttpsURLConnection扩展了HttpURLConnection,它具有HttpURLConnection等所有容量,对吧?
  6. 我确实找到this,但它并不是我想要的。

    我们当前注册新用户的想法是通过加密连接(沿https://myWebsite.com/api/?user=Bob&pass=amazing行)将URL中的信息发送到服务器(托管在https://www.heroku.com上)。

    如果有更好的方法可以做这样的事情,请告诉我。建议将很乐意考虑。我对图书馆也不太了解,所以请分享你所知道的任何可能使我的方法更加安全和快速实施的内容。

    非常感谢您的帮助! :)

1 个答案:

答案 0 :(得分:1)

  

第一个代码(与Android相关的代码)是否会使用加密连接(HTTPS)?

不会看到第一个代码所显示的网址&#39;使用,没有显示。在您引用的Android 示例中,根据定义,URL字符串"https://wikipedia.org"可以保证它。如果它以https:开头,则使用加密的HTTPS:否则,它不会,并且不会。

  

第二个怎么样?

是的,由于上述原因。

  

我们如何测试发送的信息是否已加密?

你不是。您使用https:网址。其余的是自动的。有用。工作了22年。无需测试。不要测试平台。如果您必须检查它,尝试HttpsURLConnection进行类型转换。如果是HTTPS,则会成功:否则,失败。

  

向HttpURLConnection施放威胁?

没有。我不明白你问的原因。

  

文档似乎表明它会自动重新编入&#34; HttpsURLConnection&#34;。

不,它没有。它表示创建的<{1}} 。没有铸造。

  

由于HttpsURLConnection扩展了HttpURLConnection,它具有HttpURLConnection等所有容量,对吧?

右。