HTTPS常见问题15问
HTTPS已成为网站标配,但很多开发者对其原理和配置仍有疑问.本文整理15个高频问题.
Q1: HTTPS和HTTP有什么区别?
A: HTTPS = HTTP + TLS/SSL,主要区别:
- 加密:HTTPS传输加密,HTTP明文传输
- 身份验证:HTTPS需要数字证书验证服务器身份
- 完整性:HTTPS防止数据被篡改
- 端口:HTTP默认80,HTTPS默认443
Q2: TLS握手过程是怎样的?
A: 以TLS 1.2为例(简化):
客户端 服务器 | | |-------- ClientHello (支持的加密套件) ---->| | | |<------- ServerHello (选择的加密套件) ----| |<------- Certificate (服务器证书) --------| |<------- ServerHelloDone ----------------| | | |-------- ClientKeyExchange (预主密钥) --->| |-------- ChangeCipherSpec -------------->| |-------- Finished (加密握手消息) --------->| | | |<------- ChangeCipherSpec ---------------| |<------- Finished (加密握手消息) ---------| | | |======== 加密数据传输 ===================|
Q3: 什么是数字证书?
A: 证书是服务器身份的"身份证",包含:
# 证书核心内容
{
"subject": { # 证书持有者信息
"CN": "example.com", # 域名
"O": "Example Inc", # 组织
},
"issuer": { # 签发者(CA)
"CN": "DigiCert"
},
"validity": { # 有效期
"notBefore": "2026-01-01",
"notAfter": "2027-01-01"
},
"subjectPublicKeyInfo": {...}, # 服务器公钥
"signature": {...} # CA的数字签名
}
Q4: 如何验证证书是否有效?
A: 浏览器验证三步:
- 验证签名:用CA公钥验证证书签名
- 验证有效期:检查notBefore和notAfter
- 验证域名:证书CN/SAN是否匹配访问域名
Q5: 什么是HSTS?
A: HTTP Strict Transport Security,强制使用HTTPS:
# Nginx配置HSTS add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # 含义: # max-age=31536000 - 记住1年 # includeSubDomains - 子域名也强制HTTPS
Q6: 证书类型有哪些?
| 类型 | 验证方式 | 适用场景 | 价格 |
|---|---|---|---|
| DV | 域名所有权 | 个人站点 | 免费-便宜 |
| OV | 组织真实性 | 企业官网 | 中等 |
| EV | 严格组织验证 | 金融/电商 | 贵 |
| Wildcard | 域名所有权 | 多子域名 | 中等 |
Q7: Let's Encrypt如何免费申请?
# 使用Certbot自动申请和续期 sudo apt install certbot # 申请证书(自动验证域名) sudo certbot certonly --standalone -d example.com -d www.example.com # 证书位置 /etc/letsencrypt/live/example.com/ ├── fullchain.pem # 证书链 └── privkey.pem # 私钥 # 自动续期(每60天) sudo certbot renew --dry-run
更多问题速查
- Q8: 什么是SNI? → 多域名共享IP的技术
- Q9: TLS 1.3有什么改进? → 握手更快,更安全
- Q10: 什么是前向保密? → 即使私钥泄露,历史会话也不受影响
- Q11: 证书过期怎么办? → 提前30天续期,设置监控告警
- Q12: 什么是OCSP Stapling? → 服务器预先获取证书状态,加速握手
总结
HTTPS配置不难,关键是理解原理.建议使用Let's Encrypt免费证书,配合自动化续期,既安全又省心.
