🔒 什么是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