能否不加密调用HTTPS?如何制作无TLS/SSL实现的客户端?
问题1:是否可以不加密调用HTTPS?
答案很明确:不行。
你得先搞清楚HTTPS的本质——它就是「HTTP + TLS/SSL加密」的组合,协议本身就要求传输过程必须经过TLS/SSL加密。如果跳过加密步骤,那你发送的就不是HTTPS请求,只是普通的HTTP数据而已。
而且绝大多数配置了HTTPS的服务器,都会先要求客户端完成TLS握手流程,只有握手成功、加密通道建立后,才会处理后续的HTTP请求内容。如果客户端直接发未加密的HTTP数据到HTTPS端口(默认443),服务器要么直接断开连接,要么返回TLS相关的错误,根本不会响应你的HTTP请求。
问题2:能否制作不实现TLS/SSL的客户端发起无加密的HTTPS请求?若可以,该如何实现?
首先得纠正一个概念:所谓「无加密的HTTPS请求」本身就不符合HTTPS的协议规范,所以不存在“发起无加密的HTTPS请求”这种操作——你最多只能往HTTPS端口发未加密的HTTP数据,但这不算HTTPS请求。
从技术实现上来说,你确实可以写一个简单的客户端(比如用Python的socket模块),直接连接目标服务器的443端口,然后发送普通的HTTP请求报文,比如:
GET / HTTP/1.1 Host: example.com
但这么做的结果几乎都是服务器直接关闭连接,因为服务器在443端口上监听的是TLS握手信号(比如ClientHello消息),而不是原始的HTTP报文。它根本看不懂你发的内容,自然不会给你返回正常的网页内容。
换句话说,这种客户端不是“发起无加密的HTTPS请求”,而是在错误的端口上发了错误的协议数据,完全不符合HTTPS的要求。如果真的想要无加密的HTTP请求,直接连80端口发HTTP数据就好了,没必要绕到443端口来做无用功。
内容的提问来源于stack exchange,提问作者Do Anh Tung

