1. 认证流程

双向认证流程说明:

  1. 客户端发起连接
    客户端首先向服务器发送ClientHello消息,其中包含以下信息:
    • 支持的协议版本和加密套件列表
    • 客户端随机数
  2. 服务器响应
    服务器响应客户端的ClientHello消息,并发送ServerHello消息,其中包含以下信息:
    • 服务器选择的协议版本和加密套件
    • 服务器随机数
    • 服务器证书链
  3. 客户端验证服务器证书
    客户端验证服务器证书链的有效性,包括检查证书是否由受信任的CA签发、证书是否有效以及证书中的主机名是否与服务器的主机名匹配。
  4. 客户端发送客户端证书(如果需要)
    如果服务器要求客户端进行身份验证,客户端会将自己的证书和客户端KeyProof消息发送给服务器。客户端KeyProof消息包含客户端使用服务器公钥加密的预主密钥。
  5. 服务器验证客户端证书(如果需要)
    服务器验证客户端证书的有效性,类似于客户端验证服务器证书的过程。服务器还会使用客户端公钥解密客户端KeyProof消息中的预主密钥。
  6. 双方计算共享会话密钥
    客户端和服务器使用各自的预主密钥、客户端随机数和服务器随机数来计算共享的会话密钥。
  7. 客户端发送ChangeCipherSpec消息
    客户端向服务器发送ChangeCipherSpec消息,指示服务器开始使用共享会话密钥加密通信。
  8. 服务器发送ChangeCipherSpec消息
    服务器向客户端发送ChangeCipherSpec消息,指示客户端开始使用共享会话密钥加密通信。
  9. 双方发送ApplicationData消息
    客户端和服务器可以使用共享会话密钥加密和解密ApplicationData消息,其中包含应用程序数据。

2. 客户端Nginx

nginx
  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
server { listen 25300 http2; http2_body_preread_size 256m; access_log /var/log/nginx/client/access.log; error_log /var/log/nginx/client/error.log; location / { grpc_pass grpcs://127.0.0.1:8080; grpc_ssl_certificate ca/client.crt; # 客户端证书 grpc_ssl_certificate_key ca/client.key; # 客户端私钥 grpc_ssl_trusted_certificate ca/server-ca.crt; # 可信服务端CA证书 grpc_ssl_verify on; # 开启双向认证 grpc_ssl_verify_depth 2; # 证书验证深度 proxy_http_version 1.1; grpc_set_header x-ptp-session-id "00000000000000010000000000000001"; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; } }

3. 服务端Nginx

nginx
  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
server { listen 8080 ssl http2; http2_body_preread_size 256m; ssl_certificate ca/server.crt; # 服务端端证书 ssl_certificate_key ca/server.key; # 服务端私钥 ssl_trusted_certificate ca/client.crt; # 指定可信客户端CA证书 ssl_client_certificate ca/client.crt; # 客户端CA证书 ssl_verify_client on; # 开启证书验证 access_log /var/log/nginx/server/access.log; error_log /var/log/nginx/server/error.log; location / { grpc_pass grpc://127.0.0.1:1234; proxy_http_version 1.1; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; } }

附录1:生成证书

bash
  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
1. 生成CA私钥: openssl genrsa -out ca.key 2048 此命令将生成用于证书颁发机构(CA)的2048位RSA私钥。私钥应妥善保管,因为它用于签名证书。 2. 生成CA证书: openssl req -new -x509 -key ca.key -out ca.crt -days 365 -subj "/C=US/ST=California/L=San Francisco/O=My Company/OU=IT Department/CN=My CA" 此命令将生成具有指定主题信息的自签名CA证书。days参数将证书的有效期设置为365天(一年)。 3. 生成服务器私钥: openssl genrsa -out server.key 2048 此命令将生成用于服务器的2048位RSA私钥。私钥应妥善保管,因为它用于解密客户端发送的加密数据。 4. 生成服务器证书签名请求(CSR): openssl req -new -key server.key -out server.csr -subj "/C=US/ST=California/L=San Francisco/O=My Company/OU=IT Department/CN=127.0.0.1" 此命令将为服务器生成证书签名请求(CSR)。subj参数指定服务器证书的主题信息。 5. 使用CA证书签署服务器证书: openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 此命令使用CA证书签署服务器CSR,创建最终的服务器证书。days参数将服务器证书的有效期设置为365天(一年)。 6. 验证证书: openssl verify -CAfile ca.crt server.crt 7. 查看证书 openssl x509 -in tls.crt -text -noout

附录2:参考链接