我自己搭建了一个OJ系统,只能走8080端口,但是有要求配置SSL,又要用HTTPS协议,那请问走的是443还是8080端口?
8080端口。
客户端,浏览器或者APP,拿到的请求指令URI(Uniform Resource Identifier)解析如下:
与侦听TCP 8080端口的服务器(xxx.com),建立TCP连接。发送TCP Connect()之前需要使用DNS将服务器域名(xxx.com)解析为IP地址。
TCP连接Established之后,使用该Connection ID建立TLS Session,SNI=“xxx.com”。
服务器进程通过调用TLS库函数,完成与客户端的TLS Session。在TLS Handshake阶段需要出示SNI=“xxx.com”请求的数字证书,以及上一级证书。客户端成功验证证书链(基于本地信任Root CA),双方完成Key Exchange,TLS Session成功建立。
客户端的网页请求就可以在TLS Session上加密传输。
网页请求出问题,发生在TLS阶段。由于TLS从SSL 3.0进化而来,SSL 3.0 – > TLS 1.0 -- > TLS 1.1 --> TLS 1.2 -- > TLS 1.3。每个版本都无法与前一个版本兼容。故客户端可能会尝试一个版本几次,失败了再试下一个。如果服务器与客户端支持的TLS版本没有交集,那么无论尝试多少次都会失败。
如果服务器为了最大兼容性,所有版本都支持,就会牺牲安全性!
鱼和熊掌不可兼得!
假设客户端、服务器支持所有版本,中间人只要将TLS 1.0、1.1 、1.2、1.3的Client Hello报文丢了,客户端可能会尝试SSL 3.0,最后双方成功建立SSL Session,3.0版本。
由于SSL 3.0版本的Key的长度依然停留在美国出口(Export)管制阶段的40位,破解难度大大降低。
此外,上文提到不仅要出示服务器的证书,给服务器签发证书的上一级证书也要出示。顶层的根证书,由于客户端预装并信任,可以不用发给客户端,发不发都没有问题。
以上。
更多补充阅读,请继续。
URI解析
URI = scheme ":" ["//" authority] path ["?" query] ["#" fragment]
authority = [userinfo "@"] host [":" port]
userinfo =username:password
参照以上解析,题主的URI=” https://xxx.com:8080”,解析得到信息如下:
scheme=”https”
host = “xxx.com”
port =”8080”
path = “”
username=”Anonymous”
在解析前,客户端会做一个URI格式标准化(Normalization)。
将host字符全部小写。
如果authority后没有“/”,自动添加“/”。
“/”与"?"之间的所有,即为path。
故,标准化后的URI=”https://xxx.com:8080/”
再来看一个例子
URI=”https://www.Zhihu.com/hot”
标准化后的URI=”https://www.zhihu.com/hot”
scheme=”https”
host = “zhihu.com”
port =”443”
path = “hot”
username=”Anonymous”
客户端拥有这些解析信息,就可以DNS、TCP、TLS、HTTP Request、Authentication。