HTTP 面试题 — HTTPS 的工作过程?
🚀 大家好,我是小康。
今天给大家分享一个 HTTP 面试题 :HTTPS 的工作过程?
小技巧:在面试中,可以参考下面的示例回答,这样回答简洁明了。详细介绍部分则是为了帮助大家系统学习,以便应对面试官深入提问。
示例回答:
HTTPS 通过 SSL/TLS 协议确保数据传输的安全性和完整性。工作过程包括客户端发起请求、服务器发送证书、验证证书、生成对称密钥、加密通信和传输数据。
详细解释
HTTPS 工作过程
先来看个图:
1.客户端发起请求
- 步骤:客户端(如浏览器)向服务器的 443 端口发起 HTTPS 请求,要求建立安全连接。
- 示例:用户在浏览器中输入 https://www.example.com 并按下回车。
2.服务器发送证书
- 步骤:服务器收到请求后,向客户端发送包含公钥的数字证书。这个证书由权威的证书颁发机构(CA)签名,包含服务器的公钥。
- 示例:服务器返回 SSL/TLS 证书。
3.客户端验证证书
- 步骤:客户端收到服务器的证书后,验证证书的有效性,包括证书是否由受信任的 CA 签发、证书是否在有效期内以及证书的域名是否与请求的域名匹配。
- 示例:浏览器验证服务器证书的合法性。
4.生成对称密钥
- 步骤:如果证书验证通过,客户端生成一个随机的对称密钥,并使用服务器的公钥对该密钥进行加密,然后将加密后的密钥发送给服务器。
- 示例:浏览器生成对称密钥并加密发送给服务器。
5.服务器解密对称密钥
- 步骤:服务器使用自己的私钥解密客户端发送的对称密钥。此时,客户端和服务器都持有相同的对称密钥。
- 示例:服务器解密收到的对称密钥。
6.加密通信
- 步骤:客户端和服务器使用这个对称密钥进行加密通信,确保数据在传输过程中不会被窃听或篡改。
- 示例:客户端和服务器使用对称密钥加密和解密传输的数据。
7.传输数据
- 步骤:加密通信建立后,客户端和服务器可以安全地传输数据。所有传输的数据都经过加密处理,确保数据的机密性和完整性。
- 示例:用户与网站之间的所有数据交换都是加密的。
关键点总结
- 客户端发起请求:浏览器请求 HTTPS 连接。
- 服务器发送证书:服务器提供包含公钥的证书。
- 客户端验证证书:浏览器验证证书的合法性,包括签发机构、有效期和域名匹配。
- 生成对称密钥:客户端生成对称密钥并用服务器的公钥加密。
- 服务器解密对称密钥:服务器使用私钥解密对称密钥。
- 加密通信:使用对称密钥进行加密通信。
- 传输数据:安全传输数据,确保数据的机密性和完整性。
细节说明:
上面 https 工作过程中(第二步和第五步)服务器的公钥和私钥是从哪里来的?
服务器的私钥和公钥是在设置 HTTPS 服务时生成的,并保存在服务器上。这个过程包括生成公钥和私钥,创建证书签名请求(CSR),然后从证书颁发机构(CA)获取数字证书,并配置在服务器上。
具体过程如下:(实际配置过程可能略有不同,但是原理类似):
- 生成密钥对:
在配置 HTTPS 服务时,服务器管理员使用加密工具(如 OpenSSL)生成一对公钥和私钥。
示例命令:
1
openssl genpkey -algorithm RSA -out private.key
结果: 生成一个包含公钥和私钥的私钥文件 private.key。
- 创建证书签名请求(CSR):
使用生成的私钥创建一个 CSR,其中包含公钥和其他信息(如域名)。
示例命令:
1
openssl req -new -key private.key -out server.csr
结果:生成一个 CSR 文件(server.csr),包含公钥。
- 获取数字证书:
将 CSR 发送给权威的证书颁发机构(CA),由 CA 签名生成服务器的数字证书。
示例命令:
1
openssl x509 -req -days 365 -in server.csr -signkey private.key -out server.crt
结果:CA 颁发一个数字证书(server.crt),包含服务器的公钥私钥并由 CA 签名。
- 配置服务器:
- 服务器管理员将 CA 签名的数字证书和私钥一起配置在服务器上。
- 示例配置(Nginx):
1
2
3
4
5
6server {
listen 443 ssl;
ssl_certificate /path/to/server.crt;
ssl_certificate_key /path/to/private.key;
...
}
想要了解更加详细介绍 HTTPS 工作过程的朋友可以参考这篇文章: https://segmentfault.com/a/1190000021494676
上面的图来自该链接 https://segmentfault.com/a/1190000021494676,如有侵权,请及时联系我,我删掉!
最后:
欢迎大家关注我的微信公众号「跟着小康学编程」!本号致力于分享C/C++/Go/Java 语言学习、计算机基础原理、Linux 编程、数据库、微服务、容器技术 等内容。文章力求通俗易懂,并配有代码示例,方便初学者理解。如果您对这些内容感兴趣,欢迎关注我的公众号「跟着小康学编程」。
后续,我还会陆续分享各个方向的编程面试题,包括C/C++、Java、Go,以及操作系统、计算机网络、数据结构、数据库和微服务等领域,为大家的面试提供帮助。
此外,小康最近创建了一个技术交流群,专门用来讨论技术问题和解答读者的疑问。在阅读文章时,如果有不理解的知识点,欢迎大家加入交流群提问。我会尽力为大家解答。期待与大家共同进步!