HTTPS的一点思考

基础篇:

       网上关于HTTPS的介绍有很多, 其实就是在HTTP基础上加了一层证书校验(SSL/TLS)。功能主要包括:

 1、数据传输过程是加密的(对称加密算法);

 2、客户端/服务端互相验证对方的真实性(HTTPS提供了单向/双向验证);

      如上图所示HTTPS=HTTP+SSL/TLS , 仍然是应用层协议;HTTP协议默认端口是80,HTTPS协议默认端口是443;而SSL/TLS介于应用层和传输层之间,  假设客户端(Android/iOS)访问https://www.alipay.com,  中间都经历了这几个主要流程:

1、DNS域名解析, 即将alipay.com转换为IP地址;

2、TCP三次握手, 看看ip地址是否部署了服务;

3、SSL握手, 分为单向认证和双向认证; 即判断服务端证书和客户端服务端互相验证对方证书; 详见: http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html

4、HTTPS报文传输;

       每个环节成功后才能进入下一步骤, 中间任意环节失败则流程结束。   例如SSL握手失败, 客户端就不会发送http报文。

PS:SSL握手实际上是交互3个随机数和确认加密算法, 最后使用对称加密算法加密数据, 这3个随机数是秘钥。


测试篇:

       我抓包并模拟请求京东、滴滴出行、支付宝、美团外卖、搜狐新闻等主流互联网公司app的接口, 客户端都能拿到Response。 

      PS: Okhttp/Alamofire默认支持访问CA认证的https请求,自定义证书的可不行。

private void method1() {
        //https://yingapi.yirendai.com/p2puserController/p2puserLoginV4.action
        final OkHttpClient httpClient = new OkHttpClient();
        /** final Request request = new Request.Builder()
                .url("https://pay.meituan.com/cashier/abtest?ci=1&uuid=E1019AF10F93BDB71BE61405BB29645914A65C09C9505E97218331D7D468DD48&version_name=6.2.3&utm_term=60203&utm_campaign=AwaimaiBwaimaiGmine&utm_medium=android&utm_content=866963027414954&utm_source=1501&__skck=6a375bce8c66a0dc293860dfa83833ef&__skts=1516019146806&__skua=32bcf146c756ecefe7535b95816908e3&__skno=95a8a022-71d6-4542-92bd-c1891cd8ebea&__skcy=kEv7%2FS64ARxXO5TFBqt2JqRh3iE%3D")
                .build();
        */

        /**
         final Request request = new Request.Builder()
         .url("https://api.didialift.com/beatles/innovateapi/location/getshareinfo?city_id=1&datatype=1&token=kBFPMcZPZi2ux2FBkP7zVAmyM9ewQVVLKva-rwMGoShMyDkOwjAQhtGroK-eIv_YE8dzG5awFAgJiyrK3REd5XsbRxKME-mLaqu9d69TeDEupNxYye3AeH3e55WcjPEcpEIxe5SI3bj-27iRqDQtc1eTMO6_CYwHqf0bAAD__w%3D%3D&uuid=1840680247C2D649360736174C8DEDD4&country_iso_code=CN&suuid=C424A6C02F334BDD3BA0E68EA965D7DD_15&at_mb_mcc=460&at_net_st=1&maptype=soso&cpu=Processor%09%3A%20ARMv7%20Processor%20rev%201%20(v7l)&imei=86696302741495419A2B021CA92917F9BD98FDC0C1FAE25&appversion=5.1.28&lang=zh-CN&cur_coord_type=2&bts_udid=866963027414954&channel=15&at_mb_cid=129902212&android_id=2019ef3d9b8519e5&networkType=WIFI&mac=74%3A51%3Aba%3Ad4%3A22%3A44&at_wf_ssid=%22gyj%22&at_wf_bssid=bc%3A46%3A99%3A24%3Ab1%3A20&timezone=2018-01-15%2021%3A18%3A13%20%2B0800&lng=0.0&os=6.0.1&locateTime=0&vcode=302&locatePerm=1&TripCountry=CN&at_mb_lac=4316&at_mb_mnc=00&lat=0.0&model=MI%204LTE&dviceid=f50034c2ed5675d8d318ab86f576a127")
         .post(formBody)
         .build();
         */

        /**
         final Request request = new Request.Builder()
         .url("https://restapi.amap.com/v3/iasdkauth?key=5f1f780c912b98d21325ec4668767482&ts=1516021209316&scode=0279343def71ddebfbbf5b4ee0554053")
         .post(formBody)
         .build();
         */

        /**
         *         final Request request = new Request.Builder()
         .url("https://api.k.sohu.com/api/channel/v6/news.go?p1=NjIzNjA2MzUyNTczMjAwMzg1MA%3D%3D&pid=-1&channelId=1&num=20&imgTag=1&showPic=1&picScale=11&rt=json&net=wifi&cdma_lat=39.916775&cdma_lng=116.200813&from=channel&mac=02%3A00%3A00%3A00%3A00%3A00&AndroidID=2019ef3d9b8519e5&carrier=%E4%B8%AD%E5%9B%BD%E7%A7%BB%E5%8A%A8&imei=866963027414954&imsi=460008522153925&density=3.0&apiVersion=38&isMixStream=0&skd=aefa3feaa34947f4a07f8e9adfe71ccaa87035b8e3a1a1ccfd2e4b19f5660d7bfd32c78462086b266a8bbc2635d99ac8eeb7dc08f3cfc7f3f34fd824f78b29abff9b5b9d71e79a432c17bf486fc9be9041e9c9ac494d689d51620016c75ba5daa09b49646072573d088f8111304a49b4&v=1515945600&t=1516023160&forceRefresh=0×=1&page=1&action=0&mode=0&cursor=0&mainFocalId=0&focusPosition=1&viceFocalId=0&lastUpdateTime=0&gbcode=110000&apiVersion=38&u=1&source=0&isSupportRedPacket=0&t=1516023160")
         .post(formBody)
         .build();
         */
        RequestBody formBody = new FormBody.Builder()
                .add("content", "{\"appname\":\"com.jingdong.app.mall_com.jma.track\",\"body\":[{\"appsign\":\"android_6.6.1_4fbb30eb7b7166119bd25e41eddeee2f\",\"head\":\"rJwv3A4TkfE4ZobmMKA11Gej6qzF6V7iFH+P\\/Xzapw+n0TDAxcdetvYDfaQwyUUDqeYF3MXHXr\\/nPX3If9hPM6DY3pLFxV78\",\"info\":\"iaZbZO0oqFXgQkw6y2UJZcNTTKLNYI3pQF5TsYs4LknhJkKsCzSs1eAqZLcNNqxZgCZBbS0iLkWKUkQzS2WJZGGDfXLtbCrQYJJoKAk0qFVJJkU5CyCsWcJ7SSCLNghUALtVdCs4LkzAYkk7izKs9ciCRLuNPaxYwGJA8slkKNnAg0woCyus0Qgmcn8JYqrVwr5FIKs2iEgJalV87SoKSSBedOLvcAvEKyJj82luKUSo0nv26XQL2IFSTiyPLwhVAyJi9utnLVSAfl9kqyouaEMSTzGLNqhoY+JT7ut3r91gCksojXEoRciCTmkNIKzRouJAa6tkCsHgZkyj6zWszeALZrgJd6hZwOpPKo92qFEgMlW6DTAuWYiiSv6LIgrYCz5S42l2K9QJjldk7SgK7cLCSS6JMox5gMZDrA1wq1ihkkGoCTIuWYhCSH4LZ6pdKopL6U9mKcCKg3Nm7SCqWSJibObpc4vACWZ8PasgKsHAyk+9CTEsWeC2QakNNyjxwIZDcO0kLEniAkOxC26JwUMyWXSqIq7gI4Fe8m9oi1krn1p960SHhCsGUjELbw\\/IYlpLaUthjUQKZ361rSCLaCFDW7uJIAx14KNPLws2DFAAOklkqzKuwKGuYSkJMKz1QktMp81lD+iCS3U9qiEDSUrnUGPpZ4\\/kC3M5+2dRi0QgVlS6zWAJZKNCau\\/pcYlEmdby\\/g==\",\"functionId\":\"SNavigationBar_Home\",\"sdkversion\":\"2.1.4\"}],\"whwswswws\":\"04a32246a40850dac3e0f37e2c55749648e5928777d23da5059606e3e3\"}")
                .build();

        final Request request = new Request.Builder()
                .url("https://blackhole.m.jd.com/bypass")
                .addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
                .post(formBody)
                .build();

        new Thread() {
            @Override
            public void run() {
                super.run();
                try {
                    Response response = httpClient.newCall(request).execute();
                    if (response != null) {
                        Log.d("brycegao", "response:"+response.isSuccessful());
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }.start();
    }

请求这些一线公司的接口,例如https://blackhole.m.jd.com/bypass


        使用抓包工具Charles可以看出https请求都有“SSL Handshake”,而Http请求该字段值为空。



      在这些一线公司的uri里也能看到服务接口的版本管理方法, 例如:https://restapi.amap.com/v3/iasdkauth?中的v3就是iasdkautho接口的版本号,服务版本迭代时版本号变为v3、v4等。 PS:建议uri尽量完整,至少包括模块、子功能、版本号等等信息。


客户端对HTTPS能做什么? (不附加代码了,网上一大堆)

1、不做任何配置; 从上述测试情况看,iOS/Android在没有证书情况下可以访问美团、滴滴出行、搜狐新闻、支付宝、京东等服务的接口。 PS:被攻击并拔数据的可能性很高。

2、信任所有证书;无法保证客户端/服务器是真实的。

3、设置证书; 客户端/服务器实现单向或双向SSL认证。 隐藏问题:客户端证书放在哪,如何防止被窃取?

     ssl签名文件可以放到安装包里, 用时方便也很容易被窃取。看看美团外卖apk里的这个bks文件是不是就SSL文件呢? 我觉得应该是。 我猜测该文件是做了对称或非对称加密后的问题, 通过跟服务器http接口交换得到秘钥解密出真正的ssl文件。



HTTPS一定很安全吗?

NO, 通过抓包工具能看到客户端的所有http或https请求/响应, 对请求数据进行对称或非对称加密才可靠。



SSL证书免费的很少, 一线公司都是买的CA证书。 证书分为3类,即DV(验证域名,便宜)、EV(普通企业用,较贵)、EV(金融类公司用,土豪专属)。PS:听说还有种自认证证书, *子二手车app就在用。

可以登录网址查看证书信息:https://www.chinassl.net/ssltools/ssl-checker.html


高阶问题:假如客户端抓包得到https接口的请求/响应, 然后反复发送相同的请求进行压力攻击, 服务器怎么处理这个情况?

       使用jmeter压力测试京东的https接口。



 

 我的思路:

1、服务端设置ssl双向认证, 在ssl握手时拦截非法请求;

2、网关拦截器判断请求的时间戳和服务器时间差, 例如仅接受5秒内的请求。 前置条件:客户端服务器要对时。

3、ip地址黑名单;(常规的套路)

4、提供大数据支持, 同一个ip在一段时间内访问的接口次数过多时做限制;


还有一个问题,ssl证书配置到服务器哪个节点?

我理解是最外侧节点, 例如nginx.


猜你喜欢

转载自blog.csdn.net/brycegao321/article/details/79076290