HTTPS协议与证书单、双向认证
字数 1441 2025-08-11 17:40:17
HTTPS协议与证书认证详解
一、HTTPS基础概念
HTTPS (HyperText Transfer Protocol Secure) 是由HTTP加上TLS/SSL协议构建的可进行加密传输、身份认证的网络协议。它主要通过以下技术实现互联网数据传输安全:
- 数字证书
- 加密算法
- 非对称密钥
协议版本发展
- SSL v1.0、v2.0、v3.0:早期使用的协议版本
- TLS (Transport Layer Security):由SSL发展而来,当前主流使用
- TLS v1.1
- TLS v1.2(当前最广泛使用)
- TLS v1.3(改动较大,使用较少)
二、HTTPS协议握手过程
使用Wireshark抓包分析HTTPS握手流程(以访问百度为例):
- TCP三次握手:建立TCP连接
- Client Hello:客户端发送支持的加密算法等信息
- Server Hello:服务端回应选择的加密算法
- 服务端发送:
- Certificate(证书)
- Server Key Exchange
- Server Hello Done
- 客户端发送:
- Client Key Exchange
- Change Cipher Spec
- Encrypted Handshake Message
- 服务端发送:
- New Session Ticket
- Change Cipher Spec
- Encrypted Handshake Message
- 完成密钥协商,开始加密数据传输
- TCP四次挥手结束连接(包含SSL/TLS的Encrypted Alert/ACK)
查看网站证书详情命令:
openssl s_client -connect IP:port
三、证书生成与管理
1. 生成CA证书
openssl req -newkey rsa:2048 -nodes -keyout ca_key.key -x509 -days 365 -out ca_cert.crt -subj "/C=CN/ST=GD/L=SZ/O=test/OU=dev/CN=ca.com/emailAddress=ca@ca.com"
参数说明:
-newkey rsa:2048:生成2048位RSA密钥-nodes:生成不加密的私钥-keyout:指定私钥输出文件-x509:生成自签名证书-days 365:证书有效期-subj:证书主题信息(国家/地区/组织等)- CN值为域名,必须与实际访问域名匹配
2. 生成服务端证书
# 生成私钥
openssl genrsa -out server_key.key 2048
# 生成证书请求文件
openssl req -new -key server_key.key -out server.csr -subj "/C=CN/ST=GD/L=SZ/O=test/OU=dev/CN=server.com/emailAddress=server@server.com"
# 使用CA签名生成证书
openssl x509 -req -days 3650 -in server.csr -CA ca_cert.crt -CAkey ca_key.key -CAcreateserial -out server.crt
3. 生成客户端证书
# 生成私钥
openssl genrsa -out client_key.key 2048
# 生成证书请求文件
openssl req -new -key client_key.key -out client.csr -subj "/C=CN/ST=GD/L=SZ/O=test/OU=dev/CN=client.com/emailAddress=client@client.com"
# 使用CA签名生成证书
openssl x509 -req -days 3650 -in client.csr -CA ca_cert.crt -CAkey ca_key.key -CAcreateserial -out client.crt
四、单向证书认证配置
Nginx配置示例
在nginx.conf中添加HTTPS配置:
server {
listen 443 ssl;
server_name server.com;
ssl_certificate /path/to/server.crt;
ssl_certificate_key /path/to/server_key.key;
# 其他配置...
}
客户端操作
- 将
ca_cert.crt证书安装到本地信任存储 - 使用HTTPS协议访问服务
五、双向证书认证配置
Nginx配置修改
server {
listen 443 ssl;
server_name server.com;
ssl_certificate /path/to/server.crt;
ssl_certificate_key /path/to/server_key.key;
# 开启双向认证
ssl_verify_client on;
ssl_client_certificate /path/to/ca_cert.crt;
# 其他配置...
}
客户端证书准备
将客户端证书转换为.p12格式(用于浏览器导入):
openssl pkcs12 -export -in client.crt -inkey client_key.key -out client.p12
执行命令时需要设置证书密码,后续导入浏览器时需要输入此密码。
浏览器访问
- 将
client.p12证书导入浏览器 - 访问HTTPS服务时选择导入的证书
使用cURL测试
curl --cert client.crt --key client_key.key --cacert ca_cert.crt https://server.com
注意事项:
server.com必须与证书生成时服务端的CN域名值一致- 本地需配置hosts文件(
C:\Windows\System32\drivers\etc\hosts)将域名解析到正确IP
六、关键注意事项
- CN值必须匹配:证书中的CN(Common Name)必须与实际访问的域名完全一致
- 证书链完整:确保中间证书和根证书都正确配置
- 协议版本安全:优先使用TLS 1.2,禁用不安全的SSL/TLS版本
- 私钥保护:私钥文件应妥善保管,设置适当权限
- 有效期管理:注意证书有效期,及时更新过期证书
- 双向认证性能:双向认证会增加握手开销,评估实际需求使用
通过以上步骤和配置,可以实现从单向到双向的完整HTTPS认证体系,确保网络通信的安全性和可靠性。