暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

HTTP和HTTPS的区别,看这篇就够了

xbaobao 2020-07-11
294
什么是HTTP?

超文本传输协议, 缺省工作在80端口,信息是明文传输,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。

什么是HTTPS

HTTPS是身披SSL外壳的HTTP, 缺省工作在443端口。HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。

PS:TLS是传输层加密协议,前身是SSL协议,由网景公司1995年发布,有时候两者不区分。


HTTPS单向认证流程图

名词解释:

证书:即数字证书,数字证书就是互联网通讯中标志通讯各方身份信息的一串数字,提供了一种在Internet上验证通信实体身份的方式,数字证书不是数字身份证,而是身份认证机构盖在数字身份证上的一个章或印(或者说加在数字身份证上的一个签名)。它是由权威机构——CA机构发行的,人们可以在网上用它来识别对方的身份。是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。数字证书还有一个重要的特征就是只在特定的时间段内有效

公钥和私钥:公钥(Public Key)与私钥(Private Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),公钥是密钥对中公开的部分,私钥则是非公开的部分。使用这个密钥对的时候,如果用其中一个密钥加密一段数据,必须用另一个密钥解密。比如用公钥加密数据就必须用私钥解密,如果用私钥加密也必须用公钥解密,否则解密将不会成功。

对称加密:对称密钥加密,又称私钥加密,即信息的发送方和接收方用一个密钥去加密和解密数据。它的最大优势是加/解密速度快,适合于对大数据量进行加密,对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。

非对称加密:非对称密钥加密系统,又称公钥密钥加密。非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥


HttpClient框架实现发送http和https的GET、POST请求

导入httpcore、httpclient依赖

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.StatusLine;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.client.methods.HttpRequestBase;

import org.apache.http.conn.ClientConnectionManager;

import org.apache.http.conn.scheme.Scheme;

import org.apache.http.conn.scheme.SchemeRegistry;

import org.apache.http.conn.ssl.SSLSocketFactory;

import org.apache.http.entity.StringEntity;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.util.EntityUtils;

import javax.net.ssl.SSLContext;

import javax.net.ssl.TrustManager;

import javax.net.ssl.X509TrustManager;

public class HttpSend {

    public static String sendGetRequest(String requestUrl, String[] requestHeaders) {

        HttpGet httpGet = new HttpGet(requestUrl);

        HttpSend.fillRequestHeaderIfNecessary(requestHeaders, httpGet);

        CloseableHttpClient httpClient = null;

        if(URI.create(requestUrl).getSchem().equals("https")){

              httpClientnew HttpsClient(URI.create(requestUrl).getPort());

         }

         else{

            httpClient = HttpClients.createDefault();

          }

         try{

            HttpResponse httpResponse = httpClient.execute(httpGet);

            StatusLine status = httpResponse.getStatusLine();

            int statusCode = status.getStatusCode();

            if(statusCode != 200) {

                throw new Exception("620");

              }

    

             HttpEntity entity = httpResponse.getEntity();

           if(entity != null) {

               String result = EntityUtils.toString(entity, "UTF-8");

                return result;

             }    

        } catch (Exception e) {

            e.printStackTrace();

        }finally {

            if(httpClient != null) {   

                try {

                    httpClient.close();

                } catch (Exception e) {

                    e.printStackTrace();

                }

             }

            httpGet.releaseConnection();

            httpGet.abort();

        }

        return null;

    }

    

    public static String sendPostRequest(String requestUrl, String[] requestHeaders, String requestBody) {

        HttpPost httpPost = new HttpPost(requestUrl);

        HttpSend.fillRequestHeaderIfNecessary(requestHeaders, httpPost);

        if(requestBody != null) {

            StringEntity requestEntity = new StringEntity(requestBody, "utf-8");

            httpPost.setEntity(requestEntity);

        

         CloseableHttpClient httpClient = null;

       if(URI.create(requestUrl).getSchem().equals("https")){

              httpClient = new HttpsClient(URI.create(requestUrl).getPort());

         }

         else{

            httpClient = HttpClients.createDefault();

          }

        try {

            HttpResponse httpResponse = httpClient.execute(httpPost);

            StatusLine status = httpResponse.getStatusLine();

            int statusCode = status.getStatusCode();

            if(statusCode != 200) {

                throw new Exception("620");

            }

            HttpEntity responseEntity = httpResponse.getEntity();

            if(responseEntity != null) {

                String result = EntityUtils.toString(responseEntity, "UTF-8");

                return result;

            }

         }catch (Exception e) {

            e.printStackTrace();

         }finally {

            if(httpClient != null) {   

                try {

                    httpClient.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

            httpPost.releaseConnection();

            httpPost.abort();

        }

         return null;

    }

    

    private static void fillRequestHeaderIfNecessary(String[] requestHeaders, HttpRequestBase requestMethod) {

        if(requestHeaders != null && requestHeaders.length % 2 == 1){

            try {

                throw new Exception("参数header有误");

            }catch(Exception ex) {

            }

        }

        else if(requestHeaders != null){

            int headerNum = requestHeaders.length 2;

            //设置请求头

            for(int i = 0; i < headerNum; i++){

                requestMethod.setHeader(requestHeaders[i*2],requestHeaders[i*2+1]);

            }

        }

    }

}


public class HttpsClient extends DefaultHttpClient {

        public HttpsClient(int port) {

            try {

                SSLContext ctx = SSLContext.getInstance("TLS");

                X509TrustManager tm = new X509TrustManager(){

                    public void checkClientTrusted(X509Certificate[] chain, String authType)                                 throws CertificateException{

                        }


                    public void checkServerTrusted(X509Certificate[] chain, String authType)                                 throws CertificateException{

                            //表示 信任所以证书

                        }


                       public X509Certificate[] getAcceptedIssuers() {

                            return null;

                        }

                    };


                    ctx.init(null, new TrustManager[] { tm }, null);

                    SSLSocketFactory ssf = new SSLSocketFactory(ctx,             SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

                    ClientConnectionManager ccm = getConnectionManager();

                    SchemeRegistry sr = ccm.getSchemeRegistry();

                    sr.register(new Scheme("https", port, ssf));

            }catch(Exception ex) {


            }

        }

}

文章有帮助的话,转发吧。

谢谢支持哟(*^__^*)




文章转载自xbaobao,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论