1.HTTPS 是什么?
HTTPS = HTTP + SSL/TLS
HTTP:超文本传输协议(明文传输)
SSL/TLS:安全套接层/传输层安全协议(加密层)
2.为什么需要 HTTPS?
| 攻击类型 | HTTP 风险 | HTTPS 防护 |
|---|---|---|
| 窃听 | 数据明文传输,可被截获 | 数据加密传输 |
| 篡改 | 可修改传输内容 | 内容完整性校验 |
| 冒充 | 可伪装成合法网站 | 身份认证 |
3.核心工作原理:非对称加密 + 对称加密
3.1混合加密流程
客户端 服务器 | | | 1. Client Hello (支持的加密算法) | |------------------------------------->| | | | 2. Server Hello (选择的算法+证书) | |<-------------------------------------| | | | 3. 验证证书合法性 | | | | 4. 生成随机对称密钥 | | 用服务器公钥加密对称密钥 | |------------------------------------->| | | | 5. 服务器私钥解密获取对称密钥 | | | | 6. 使用对称密钥加密通信 | |<====================================>|3.2为什么混合使用?
非对称加密:安全但慢,用于交换对称密钥
对称加密:快速高效,用于实际数据传输
4.数字证书原理
4.1证书包含内容
证书 = { 版本信息 序列号 签名算法 颁发者 有效期 主体(域名) 主体公钥 扩展信息 证书签名(CA私钥加密的摘要) }4.2证书验证流程
// 简化的验证逻辑 function verifyCertificate(certificate) { // 1. 检查证书是否过期 if (Date.now() > certificate.expiry) { return false; } // 2. 检查域名是否匹配 if (currentDomain !== certificate.domain) { return false; } // 3. 验证证书链 const rootCA = getRootCA(); const issuerCert = getIssuerCertificate(); // 4. 验证签名 const hash = sha256(certificate.data); const decryptedSignature = rsaDecrypt( certificate.signature, issuerCert.publicKey ); return hash === decryptedSignature; }5.SSL/TLS 握手详细过程
5.1完整握手(Full Handshake)
1. Client Hello - 客户端随机数 (Client Random) - 支持的密码套件 (Cipher Suites) - 支持的TLS版本 - Session ID (如果有) 2. Server Hello - 服务器随机数 (Server Random) - 选择的密码套件 - 数字证书 3. Server Certificate (可选) - 服务器证书链 4. Server Key Exchange (可选) - 密钥交换参数 5. Server Hello Done 6. Client Key Exchange - 预主密钥 (Pre-master Secret) - 用服务器公钥加密 7. Change Cipher Spec - 通知使用新加密参数 8. Finished - 验证握手完整性5.2密钥生成过程
# 伪代码表示密钥生成 def generate_keys(client_random, server_random, pre_master_secret): # 1. 生成主密钥 master_secret = PRF( pre_master_secret, "master secret", client_random + server_random, 48 # 48字节长度 ) # 2. 生成会话密钥 key_block = PRF( master_secret, "key expansion", server_random + client_random, required_length ) # 3. 分割成不同用途的密钥 client_write_MAC_key = key_block[0:20] server_write_MAC_key = key_block[20:40] client_write_key = key_block[40:56] server_write_key = key_block[56:72] client_write_IV = key_block[72:88] server_write_IV = key_block[88:104] return { "client_mac_key": client_write_MAC_key, "server_mac_key": server_write_MAC_key, "client_key": client_write_key, "server_key": server_write_key, "client_iv": client_write_IV, "server_iv": server_write_IV }6.加密算法演进
6.1TLS 版本发展
SSL 2.0 (1995) → SSL 3.0 (1996) → TLS 1.0 (1999) → TLS 1.1 (2006) → TLS 1.2 (2008) → TLS 1.3 (2018)6.2现代 TLS 1.3 优化
// TLS 1.3 简化握手 (1-RTT) const tls13Handshake = { // 客户端第一次发送就包含密钥共享 clientHello: { random: clientRandom, key_share: clientPublicKey, // 新增 supported_versions: "TLS 1.3", cipher_suites: [...] }, // 服务器立即回复 serverHello: { random: serverRandom, key_share: serverPublicKey, cipher_suite: selectedCipher }, // 可以立即开始加密通信 encryptedExtensions: {...}, certificate: {...}, finished: {...} };7.证书类型
7.1DV、OV、EV 证书区别
Domain Validation (DV): - 验证: 仅验证域名所有权 - 颁发速度: 几分钟 - 适合: 个人网站、博客 - 显示: 🔒 + https Organization Validation (OV): - 验证: 验证企业身份 - 颁发速度: 1-3天 - 适合: 企业官网 - 显示: 🔒 + 公司名称 Extended Validation (EV): - 验证: 严格的企业身份验证 - 颁发速度: 5-7天 - 适合: 银行、电商 - 显示: 🔒 + 绿色地址栏 + 公司名称7.2免费证书 vs 付费证书
// Let's Encrypt (免费) const freeCert = { type: "DV", validity: "90天", autoRenew: true, features: ["基本加密"], cost: "$0", trust: "广泛信任" }; // 商业证书 const commercialCert = { type: ["OV", "EV"], validity: "1-2年", warranty: "$10k-$1.75M", features: ["SSL", "恶意软件扫描", "漏洞评估"], cost: "$50-$1000/year", trust: "最高级别信任" };8.实际配置示例
8.1Nginx HTTPS 配置
server { listen 443 ssl http2; server_name example.com; # 证书文件 ssl_certificate /path/to/fullchain.pem; ssl_certificate_key /path/to/private.key; # 安全配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512; ssl_prefer_server_ciphers off; # HSTS (强制HTTPS) add_header Strict-Transport-Security "max-age=63072000" always; # OCSP Stapling ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /path/to/chain.pem; }8.2Node.js HTTPS 服务器
const https = require('https'); const fs = require('fs'); const options = { key: fs.readFileSync('server-key.pem'), cert: fs.readFileSync('server-cert.pem'), // 现代安全配置 minVersion: 'TLSv1.2', ciphers: [ 'ECDHE-RSA-AES128-GCM-SHA256', 'ECDHE-RSA-AES256-GCM-SHA384' ].join(':'), // 启用SNI SNICallback: (domain, cb) => { // 根据域名返回不同证书 if (domain === 'example.com') { cb(null, tls.createSecureContext({ key: exampleKey, cert: exampleCert })); } } }; const server = https.createServer(options, (req, res) => { res.writeHead(200); res.end('Secure connection!'); }); server.listen(443);9.性能优化
9.1TLS 会话恢复
// Session ID 恢复 const sessionCache = { "session-id-123": { masterSecret: "...", cipherSuite: "TLS_AES_256_GCM_SHA384", createdAt: Date.now() } }; // Session Ticket (无状态恢复) const sessionTicket = encrypt({ masterSecret: "...", lifetime: 3600, timestamp: Date.now() }, ticketKey);9.2HTTP/2 多路复用
HTTPS + HTTP/2 优势: 1. 单个连接多请求 2. 头部压缩 (HPACK) 3. 服务器推送 4. 请求优先级 效果:减少握手次数,提升性能10.安全最佳实践
10.1SSL/TLS 配置检查清单
必须配置: - 禁用 SSLv2、SSLv3、TLSv1.0、TLSv1.1 - 启用完美前向保密 (PFS) - 启用 HSTS - 启用 OCSP Stapling - 使用强加密套件 推荐配置: - 启用 TLS 1.3 - 启用 0-RTT (谨慎使用) - 配置证书透明度 (CT) - 使用安全的密钥交换算法10.2证书监控
// 证书过期监控脚本 const checkCertificateExpiry = async (domain) => { const cert = await getCertificate(domain); const expiryDate = new Date(cert.valid_to); const daysUntilExpiry = Math.floor( (expiryDate - new Date()) / (1000 * 60 * 60 * 24) ); if (daysUntilExpiry < 30) { sendAlert(`证书 ${domain} 将在 ${daysUntilExpiry} 天后过期`); } };11.常见攻击与防护
11.1中间人攻击 (MITM) 防护
// 证书固定 (Certificate Pinning) const expectedPublicKey = "sha256/AAAAAAAAAAAAAAAAAAAAAA=="; fetch('https://api.example.com/data', { agent: new https.Agent({ // 验证服务器证书公钥 checkServerIdentity: (host, cert) => { const publicKey = cert.pubkey; const fingerprint = sha256(publicKey); if (fingerprint !== expectedPublicKey) { throw new Error('证书指纹不匹配'); } } }) });11.2降级攻击防护
# Nginx 配置防止降级攻击 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 禁用不安全的重新协商 ssl_renegotiation off;12.调试与测试工具
12.1命令行工具
# 检查证书信息 openssl s_client -connect example.com:443 -servername example.com # 检查支持的协议 nmap --script ssl-enum-ciphers -p 443 example.com # 测试SSL配置 sslscan example.com testssl.sh example.com # Qualys SSL Labs测试 # 访问: https://www.ssllabs.com/ssltest/12.2在线测试项目
SSL Labs: 全面的SSL/TLS配置测试 Mozilla SSL Config Generator: 生成最佳配置 CipherSuite.Info: 密码套件详细信息 Certificate Transparency: 证书透明度查看总结
HTTPS 通过四个核心机制确保安全:
加密- 防止窃听
完整性校验- 防止篡改
身份认证- 防止冒充
不可否认性- 防止抵赖
现代 Web 开发必须使用 HTTPS,不仅是安全要求,也是:
SEO 排名因素(Google 优先索引 HTTPS)
现代浏览器 API 的前置条件(地理位置、Service Workers等)
PWA 应用的基本要求
用户信任的重要标志
推荐实践:
所有网站启用 HTTPS
使用 TLS 1.2+,优先 TLS 1.3
配置 HSTS 头部
自动续期证书(如 Let's Encrypt)
定期进行安全扫描和测试