HTTP、HTTPS、TLS 和 SSL 证书
HTTP:HyperText Transfer Protocol 超文本传输协议。
HTTPS :Hypertext Transfer Protocol Secure 超文本传输安全协议
TLS : Transport Layer Security 传输层安全性协议
SSL :Secure Sockets Layer 安全套接字层
TLS 是 SSL 的升级版,HTTPS 现在使用的是 TLS,而不是早期的 SSL。
SSL 是 TLS 的前身,现在 HTTPS 使用 TLS 协议;“SSL证书”只是历史叫法,实际保护网站的是 TLS。
SSL 证书这个名字是历史遗留叫法,现在实际用于 TLS 协议。
它本质上是一个 数字证书(Digital Certificate),作用是:
向访问者证明:“这个服务器确实拥有这个域名,并且它拥有对应的密码学身份。”
简单说,HTTPS = HTTP + TSL 加密。
HTTP 是一种协议用于浏览器和服务器之间的通信,但是这只是一种信息传递的方式规则,这个规则不会对传递的信息进行加密,而TLS是一种加密的协议,将二者结合就可以实现加密通讯,从而保证信息安全,而这就是 HTTPS。
TLS 负责:
- 加密:防止别人读取内容
- 身份验证:通过证书确认服务器身份
- 完整性保护:发现数据是否被篡改
TLS 的加密包括,信息加密,身份验证和完整性保护等,TLS 不是单独的加密算法,TLS 会使用多种密码学算法,但它本身不是其中任何一种。
SSL 证书是由受浏览器信任的证书颁发机构(也就是 CA)签发的。用于验证这个域名在这个服务器的控制之下。防止 DNS 拦截,或者伪装成这个网站。SSL 证书是 TLS 身份验证的一部分。
SSL 证书任何人都可以签发,但是不一定会被信任,一般来说,只有大型的 CA 签发的证书才被浏览器信任。对于不信任的证书,服务器可以加密传输信息,但是不能确定这个服务器是否就是此域名的服务器,一般浏览器会警告(不信任的证书)。
协议本质是什么
“协议”不是某个程序,也不是某种单独的加密算法,而是一套通信规则。
它规定通信双方:
- 先发送什么数据;
- 收到后如何处理;
- 使用什么格式;
- 如何选择加密算法;
- 如何验证证书;
- 如何生成密钥;
- 出错时如何终止连接。
这些HTTPS 或者TLS的协议我们都是有的,所以只需要申请一个证书,就可以使用HTTPS进行连接了?
对,理解方向基本正确:
浏览器、Nginx 等软件已经实现了 HTTP 和 TLS 协议。你不需要自己编写加密算法,只需要给服务器配置一套有效的证书和私钥,Nginx 就能使用 TLS 提供 HTTPS。
但严格来说,不是“只有证书文件就够了”,还需要几个条件同时满足。
实际需要的东西
1. 支持 TLS 的服务器程序,例如 Nginx
2. 域名,例如 meet.example.com
3. 该域名对应的 TLS 证书
4. 与证书公钥配对的私钥
5. Nginx 的 HTTPS 配置
6. 公网开放 443 端口
证书和私钥一般是:
fullchain.pem 证书和证书链,可以公开
privkey.pem 网站私钥,必须保密
Nginx 配置类似:
server {
listen 443 ssl;
server_name meet.example.com;
ssl_certificate
/etc/letsencrypt/live/meet.example.com/fullchain.pem;
ssl_certificate_key
/etc/letsencrypt/live/meet.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3000;
}
}
配置完成后,Nginx 自动完成这些工作:
浏览器发起 TLS 握手
↓
Nginx 发送证书
↓
浏览器验证域名、CA 签名和有效期
↓
Nginx 用私钥证明自己是证书持有者
↓
双方协商会话密钥
↓
开始传输加密的 HTTP 数据
所以你不需要手动处理:
加密算法
数字签名计算
密钥交换
会话密钥生成
HTTP 数据加密和解密
这些都由浏览器和 Nginx 的 TLS 实现自动完成。
为什么必须申请证书
TLS 协议本身只是规定:
双方应该怎样建立安全连接。
但浏览器还需要知道:
当前连接的服务器是不是
meet.example.com的真实服务器。
证书就是解决这个身份问题的。
没有证书,也可以建立某种加密连接,但浏览器无法确认对方身份,容易遭受中间人攻击。
证书和私钥必须配套
只有证书:
fullchain.pem
是不够的。
因为证书中的公钥对应一把私钥,Nginx 必须拥有:
privkey.pem
才能完成 TLS 握手中的身份认证。
可以理解成:
证书 = 公开身份证
私钥 = 只有本人拥有的身份凭据
攻击者可以复制公开证书,但没有私钥,仍然无法正常冒充网站。
Certbot 为什么方便
你执行:
sudo certbot --nginx -d meet.example.com
Certbot通常会自动:
生成或管理私钥
向 Let's Encrypt 申请证书
完成域名控制验证
下载证书链
修改 Nginx 配置
启用 443
配置自动续期
重新加载 Nginx
所以从使用者角度看,确实接近:
申请一张证书,配置到 Nginx,就可以使用 HTTPS。
更准确的一句话是:
HTTP 和 TLS 协议已经由浏览器、操作系统和 Nginx 实现;我们只需要准备有效证书及对应私钥,并让 Nginx 在 443 端口加载它们,就能提供受浏览器信任的 HTTPS 服务。

浙公网安备 33010602011771号