跳至正文

🔒 什么是HTTPS和SSL/TLS?

📖 定义

HTTPS(HyperText Transfer Protocol Secure, 超文本传输安全协议)是在HTTP上添加了安全层的协议。SSL(Secure Sockets Layer, 安全套接字层)和TLS(Transport Layer Security, 传输层安全)是加密互联网通信的协议,TLS是SSL的后续版本。它们加密网站与用户之间传输的数据以确保安全。

🎯 用类比理解

普通邮件 vs 挂号信

  • HTTP: 像明信片一样,任何人都能看到内容的通信
  • HTTPS: 像密封的挂号信一样,只有本人能打开的安全通信
  • SSL/TLS证书: 邮件上的官方认证印章

用普通邮件(HTTP)发送密码的话,邮局工作人员或其他人都能看到,但密封的挂号信(HTTPS)只有收件人能打开。

⚙️ 工作原理

1. SSL/TLS握手过程

1. 客户端 → 服务器: "我想建立安全连接"
- 发送支持的加密方式列表

2. 服务器 → 客户端: "这是我的证书"
- 发送SSL/TLS证书和公钥

3. 客户端: 验证证书
- 检查是否由可信CA(证书颁发机构)颁发
- 验证证书有效性

4. 客户端 → 服务器: 创建加密会话密钥
- 用服务器公钥加密会话密钥并发送

5. 服务器: 解密会话密钥
- 用自己的私钥解密会话密钥

6. 开始安全通信
- 用会话密钥加密所有数据进行传输

2. 加密方式

非对称加密 (握手)
├─ 公钥: 加密数据
└─ 私钥: 解密数据

对称加密 (实际通信)
└─ 会话密钥: 快速加密/解密

💡 实际示例

HTTP vs HTTPS对比

// ❌ HTTP - 不安全
// http://example.com/login
// 密码以明文传输
POST /login
Content-Type: application/json

{
"username": "user123",
"password": "mypassword123" // 任何人都能看到!
}

// ✅ HTTPS - 安全
// https://example.com/login
// 所有数据都被加密
POST /login
Content-Type: application/json

{
"username": "user123",
"password": "mypassword123" // 加密传输
}

SSL/TLS证书验证

在浏览器中点击锁图标:

✅ 安全网站
- 颁发给: example.com
- 颁发者: Let's Encrypt (可信CA)
- 有效期: 2024-01-01 ~ 2024-12-31
- 加密: TLS 1.3

⚠️ 需要注意
- 证书已过期
- 自签名证书
- 证书域名与网站域名不符

在Node.js中创建HTTPS服务器

const https = require('https');
const fs = require('fs');

// 加载SSL/TLS证书
const options = {
key: fs.readFileSync('private-key.pem'), // 私钥
cert: fs.readFileSync('certificate.pem') // 证书
};

// 创建HTTPS服务器
https.createServer(options, (req, res) => {
res.writeHead(200);
res.end('安全的HTTPS连接!');
}).listen(443);

console.log('HTTPS服务器在端口443上运行中');

🤔 常见问题

Q1. SSL和TLS有什么区别?

A: SSL是旧协议,TLS是SSL的改进最新版本。但习惯上我们仍说"SSL证书",实际使用的是TLS。

SSL 1.0 (不再使用)
SSL 2.0 (不再使用)
SSL 3.0 (不再使用)
TLS 1.0 (遗留)
TLS 1.1 (遗留)
TLS 1.2 (当前使用) ✅
TLS 1.3 (最新,最安全) ✅

Q2. 为什么所有网站都应该使用HTTPS?

A: HTTPS保护以下方面:

1. 机密性 (Confidentiality)
└─ 第三方无法看到数据

2. 完整性 (Integrity)
└─ 确保数据未被中途篡改

3. 认证 (Authentication)
└─ 证明访问的网站是真实的

4. SEO优势
└─ Google给HTTPS网站加分

Q3. Let's Encrypt是什么?

A: 免费颁发SSL/TLS证书的证书颁发机构(CA)。

# 使用Certbot自动安装
sudo certbot --nginx -d example.com

# 自动续期(每90天)
sudo certbot renew --dry-run

Q4. 什么是混合内容(Mixed Content)警告?

A: 在HTTPS页面上加载HTTP资源时产生的安全警告。

<!-- ❌ 混合内容 - 安全警告 -->
<html>
<head>
<!-- HTTPS页面 -->
</head>
<body>
<!-- 加载HTTP图片 - 产生警告! -->
<img src="http://example.com/image.jpg">

<!-- HTTP脚本 - 被阻止! -->
<script src="http://example.com/script.js"></script>
</body>
</html>

<!-- ✅ 正确方式 -->
<html>
<body>
<!-- 使用HTTPS -->
<img src="https://example.com/image.jpg">

<!-- 或使用协议相对URL -->
<img src="//example.com/image.jpg">
</body>
</html>

Q5. HTTPS会变慢吗?

A: 过去是的,但现代TLS 1.3和硬件加速使性能差异几乎可以忽略不计。

TLS 1.2握手: 2-RTT (往返时间)
TLS 1.3握手: 1-RTT
TLS 1.3重连: 0-RTT (立即连接!)

+ HTTP/2仅支持HTTPS → 实际上更快

🎓 下一步

了解HTTPS后,继续学习:

  1. 什么是CORS? (文档编写中) - 与HTTPS同样重要的Web安全
  2. JWT令牌 (文档编写中) - 安全的认证方式
  3. 什么是DNS? - 域名与安全

实践练习

# 1. 创建自签名证书(开发用)
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes

# 2. 运行HTTPS服务器
node https-server.js

# 3. 在浏览器中验证
# https://localhost (忽略自签名警告继续)

🎬 总结

HTTPS和SSL/TLS是现代Web的必备安全技术:

  • HTTPS: 在HTTP上添加安全层的协议
  • SSL/TLS: 加密数据的安全协议
  • 证书: 证明网站身份的数字身份证
  • 加密: 安全保护数据的技术

所有网站都应使用HTTPS来保护用户。多亏了Let's Encrypt,现在可以免费轻松应用! 🔒✨