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握手流程(以访问百度为例):

  1. TCP三次握手:建立TCP连接
  2. Client Hello:客户端发送支持的加密算法等信息
  3. Server Hello:服务端回应选择的加密算法
  4. 服务端发送
    • Certificate(证书)
    • Server Key Exchange
    • Server Hello Done
  5. 客户端发送
    • Client Key Exchange
    • Change Cipher Spec
    • Encrypted Handshake Message
  6. 服务端发送
    • New Session Ticket
    • Change Cipher Spec
    • Encrypted Handshake Message
  7. 完成密钥协商,开始加密数据传输
  8. 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;
    
    # 其他配置...
}

客户端操作

  1. ca_cert.crt证书安装到本地信任存储
  2. 使用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

执行命令时需要设置证书密码,后续导入浏览器时需要输入此密码。

浏览器访问

  1. client.p12证书导入浏览器
  2. 访问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

六、关键注意事项

  1. CN值必须匹配:证书中的CN(Common Name)必须与实际访问的域名完全一致
  2. 证书链完整:确保中间证书和根证书都正确配置
  3. 协议版本安全:优先使用TLS 1.2,禁用不安全的SSL/TLS版本
  4. 私钥保护:私钥文件应妥善保管,设置适当权限
  5. 有效期管理:注意证书有效期,及时更新过期证书
  6. 双向认证性能:双向认证会增加握手开销,评估实际需求使用

通过以上步骤和配置,可以实现从单向到双向的完整HTTPS认证体系,确保网络通信的安全性和可靠性。

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) 查看网站证书详情命令: 三、证书生成与管理 1. 生成CA证书 参数说明: -newkey rsa:2048 :生成2048位RSA密钥 -nodes :生成不加密的私钥 -keyout :指定私钥输出文件 -x509 :生成自签名证书 -days 365 :证书有效期 -subj :证书主题信息(国家/地区/组织等) CN值为域名 ,必须与实际访问域名匹配 2. 生成服务端证书 3. 生成客户端证书 四、单向证书认证配置 Nginx配置示例 在nginx.conf中添加HTTPS配置: 客户端操作 将 ca_cert.crt 证书安装到本地信任存储 使用HTTPS协议访问服务 五、双向证书认证配置 Nginx配置修改 客户端证书准备 将客户端证书转换为.p12格式(用于浏览器导入): 执行命令时需要设置证书密码,后续导入浏览器时需要输入此密码。 浏览器访问 将 client.p12 证书导入浏览器 访问HTTPS服务时选择导入的证书 使用cURL测试 注意事项: server.com 必须与证书生成时服务端的CN域名值一致 本地需配置hosts文件( C:\Windows\System32\drivers\etc\hosts )将域名解析到正确IP 六、关键注意事项 CN值必须匹配 :证书中的CN(Common Name)必须与实际访问的域名完全一致 证书链完整 :确保中间证书和根证书都正确配置 协议版本安全 :优先使用TLS 1.2,禁用不安全的SSL/TLS版本 私钥保护 :私钥文件应妥善保管,设置适当权限 有效期管理 :注意证书有效期,及时更新过期证书 双向认证性能 :双向认证会增加握手开销,评估实际需求使用 通过以上步骤和配置,可以实现从单向到双向的完整HTTPS认证体系,确保网络通信的安全性和可靠性。