HTTPS的一点思考

本文探讨了HTTPS的基础,包括其在HTTP上的增强——证书校验(SSL/TLS),数据加密和身份验证。通过DNS解析、TCP连接、SSL握手及HTTPS报文传输四个步骤解析了HTTPS的工作流程。同时,分享了抓包测试一线互联网公司HTTPS接口的经验,指出客户端对HTTPS的处理方式可能带来的安全风险。最后,讨论了HTTPS的安全挑战,如证书类型、防止中间人攻击的策略以及SSL证书的配置位置问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基础篇:

       网上关于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.


<think>好的,用户现在需要更具体的学习计划,因为他感到迷茫。之前我已经给出了两个阶段的计划,但可能不够详细,导致他还不清楚每天该做什么。 首先,我需要回顾之前的回复,确保没有遗漏关键点。之前的计划分为3个月实习突击和6个月入职进阶,涵盖了Python、机器学习、深度学习、项目包装,以及后续的数学、工程能力和领域专精。但用户可能觉得步骤不够细化,不知道如何具体安排时间或资源。 接下来,用户提到“具体一点,我有点迷茫”,说明他需要更明确的步骤、时间安排和资源指引。可能需要将每个阶段拆解到每周或每天的任务,给出具体的学习资源链接,或者推荐更详细的学习路径。 另外,用户是小白,可能需要更基础的建议,比如如何安装工具,如何开始第一个项目,遇到问题该怎么解决。之前的建议提到PyCharm和Anaconda,但可能需要更详细的安装配置指南,或者推荐具体的教程链接。 还要考虑用户的时间管理问题,大三下可能还有课程或其他事务,如何平衡学习与其他任务。可能需要建议每天的时间分配,比如每天抽出多少小时,如何高效利用周末等。 另外,用户可能对如何选择方向(CV或NLP)有疑问,需要给出选择的依据或各方向的前景,帮助他做出决定。同时,项目实战部分可能需要更详细的步骤,比如从哪里获取数据集,如何逐步构建项目,避免卡在某个环节。 还要注意提醒用户避免常见的陷阱,比如过于纠结数学理论而忽略实践,或者只关注模型准确率而忽视工程化部署。这些在之前的回复中提到过,但可能需要再次强调,并给出实际例子。 最后,用户可能需要心理上的鼓励,比如如何保持动力,遇到困难时如何寻求帮助,或者如何加入学习社区与其他人交流。这些支持性的建议能帮助他坚持下去。 总结下来,需要将每个阶段拆解为更具体的周计划,提供详细的学习资源链接,明确每日任务,指导工具安装和使用,给出项目实战的步骤,并加入时间管理和心理建设的建议。这样用户才能有清晰的路线图,减少迷茫感。</think>好的,我拆解成「每日可执行步骤」,用最接地气的方式告诉你每个阶段具体做什么,精确到每周任务安排和资源链接。(文末附可直接下载的速查表) --- ### 🌟 **【3个月实习突击计划】逐周执行表** **核心工具**:Python 3.8+ / PyCharm / Jupyter Notebook / Git #### 📅 **第1-2周:Python速成攻坚** ✅ **每日任务**(早1h+晚1h): - 早:在[菜鸟教程](https://www.runoob.com/python3/python3-tutorial.html)完成10个小练习(重点:列表推导式/异常处理/文件读写) - 晚:用Pandas处理豆瓣电影Top250数据([数据集](https://github.com/SophonPlus/ChineseNlpCorpus/blob/master/datasets/douban_movie_top250/douban_movie_top250.csv)) ```python # 示例任务:统计不同类型电影出现次数 import pandas as pd df = pd.read_csv('douban_top250.csv') genres = df['类型'].str.split('/').explode() print(genres.value_counts()[:5]) ``` #### 📅 **第3-4周:机器学习实战** ✅ **关键动作**: 1. 看吴恩达课程时同步做笔记([课程笔记模板](https://zhuanlan.zhihu.com/p/132561405)) 2. 每天推导一个公式(例如逻辑回归的损失函数): $$ J(\theta) = -\frac{1}{m}\sum_{i=1}^m [y^{(i)}\log(h_\theta(x^{(i)})) + (1-y^{(i)})\log(1-h_\theta(x^{(i)}))] $$ 3. 周末用随机森林预测鸢尾花种类([代码示例](https://scikit-learn.org/stable/auto_examples/datasets/plot_iris_dataset.html)) #### 📅 **第5-6周:深度学习初体验** ✅ **必做三件事**: 1. 安装CUDA教程:[Win/Mac双版本指南](https://zhuanlan.zhihu.com/p/336429888) 2. MNIST手写识别实操: ```python import torch model = torch.nn.Sequential( torch.nn.Linear(784, 256), torch.nn.ReLU(), torch.nn.Linear(256, 10) ) # 具体训练代码参考:https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html ``` 3. 下载YOLOv5口罩检测代码([GitHub仓库](https://github.com/ultralytics/yolov5)),替换自己的数据集 #### 📅 **第7-12周:项目冲刺期** ✅ **项目执行清单**: - 股票预测项目: 1. 从[AKShare](https://www.akshare.xyz/)获取股票数据 2. 用LSTM构建预测模型(参考[这篇教程](https://zhuanlan.zhihu.com/p/139617233)) 3. 用Plotly画出预测曲线与实际值对比 - GitHub仓库规范: ``` /Stock_Forecast │ README.md(说明文档模板见下图) │ requirements.txt ├───data ├───models └───notebooks │ data_processing.ipynb │ model_training.ipynb ``` --- ### 🚀 **【6个月入职进阶计划】关键里程碑** **核心工具**:Docker / Flask / Transformers库 #### 🎯 **阶段1:数学补缺(第1个月)** ✅ **每周重点**: - 周一:推导梯度下降公式(从泰勒展开理解) $$ \theta_{t+1} = \theta_t - \eta \nabla J(\theta_t) $$ - 周三:用特征分解解释PCA降维(用NumPy实现) - 周五:通过贝叶斯公式理解朴素贝叶斯分类器 #### 🎯 **阶段2:工程化实战(第2-3个月)** ✅ **Docker部署速成**: ```bash # 把训练好的模型打包成镜像 FROM python:3.8 COPY requirements.txt . RUN pip install -r requirements.txt COPY app.py /app/ CMD ["python", "/app/app.py"] ``` ✅ **Flask接口开发**: ```python from flask import Flask, request app = Flask(__name__) @app.route('/predict', methods=['POST']) def predict(): data = request.json['text'] # 调用你的模型 return {'result': model.predict(data)} if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) ``` #### 🎯 **阶段3:领域专精(第4-6个月)** **🔍 CV方向进阶路线**: 1. 掌握MMDetection框架([官方教程](https://mmdetection.readthedocs.io/zh_CN/latest/)) 2. 复现YOLOv4到v8的改进点(Focus结构/Anchor Free等) 3. Kaggle实战:参加[卫星图像分割竞赛](https://www.kaggle.com/c/dstl-satellite-imagery-feature-detection) **🔍 NLP方向进阶路线**: 1. 用HuggingFace实现文本摘要([实战代码](https://huggingface.co/docs/transformers/tasks/summarization)) 2. 学习Prompt Engineering技巧(参考[这篇综述](https://arxiv.org/abs/2107.13586)) 3. 部署BERT服务(使用[bert-as-service](https://github.com/hanxiao/bert-as-service)) --- ### 📌 **关键问题应对指南** **Q:代码跑不通怎么办?** - 第一反应:检查错误提示→复制到Google→前3个Stack Overflow结果必看 - 终极方案:在GitHub提Issue时附上**完整报错截图+环境信息** **Q:面试被问项目细节?** - 必备话术:“在这个股票预测项目中,我通过实验发现当滑动窗口设置为20天时MSE最低,这是因为...”(体现迭代思考) **Q:如何选择CV/NLP?** - 测试法:花3天时间分别做: - CV:用OpenCV实现人脸马赛克 - NLP:用BERT做电影评论情感分析 - 哪个做起来更兴奋就选哪个 --- ### 📁 **资源直通车** 1. **代码模板**:[AI项目结构示例](https://github.com/AlexHex7/Data-Science-project-template) 2. **面试题库**:[AI岗高频50题解析](https://zhuanlan.zhihu.com/p/363194929) 3. **速查表**:[PyTorch常用代码片段](https://zhuanlan.zhihu.com/p/111144134) 现在立刻打开电脑,完成这三个动作: 1. 安装Anaconda([Windows教程](https://www.bilibili.com/video/BV1Yt41137XZ)|[Mac教程](https://www.bilibili.com/video/BV1Mh411e7VU)) 2. 在LeetCode上每天刷1道Easy题([Python题库](https://leetcode.cn/problemset/all/?difficulty=EASY&page=1)) 3. 关注Arxiv每日最新论文(用[这个订阅工具](https://arxiv.org/help/rss)) 迷茫的本质是行动量不足——先让第一个MNIST程序跑起来,你会在调试bug的过程中自然找到方向!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值