TLS客户端认证

场景说明

  • 服务端使用TLS客户端认证对客户端进行认证。

配置步骤

  • Step 1. 生成根证书
  1. openssl genrsa -out root.key 2048
  2. openssl req -new -x509 -days 365 -key root.key -out root.crt
  • Step 2. 创建客户端证书签名申请
  1. openssl genrsa -out client.key 2048
  2. openssl req -new -out client.csr -key client.key
  • Step 3. 生成客户端证书
  1. echo "extendedKeyUsage = clientAuth" > openssl.cnf
  2. openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA root.crt -CAkey root.key -days 365 -extfile openssl.cnf
  • Step 4. 配置4层负载均衡服务

    • 客户端认证针对VIP启用,配置4层负载均衡服务是为了获取VIP。

    • 示例中,使用HAproxy作为4层负载均衡服务,通过PROXY协议将VIP传递给BFE,HAproxy与BFE同机部署。

    • 安装HAproxy,下载www.haproxy.org。Ubuntu系统可通过apt install haproxy安装。

    • 配置HAproxy,配置文件(haproxy.cfg)示例:

  1. global
  2. defaults
  3. mode tcp
  4. balance leastconn
  5. timeout client 3000ms
  6. timeout server 3000ms
  7. timeout connect 3000ms
  8. frontend fr_server_http
  9. bind 0.0.0.0:7080
  10. default_backend bk_server_http
  11. backend bk_server_http
  12. server srv1 0.0.0.0:8080 maxconn 2048 send-proxy
  13. frontend fr_server_https
  14. bind 0.0.0.0:7443
  15. default_backend bk_server_https
  16. backend bk_server_https
  17. server srv1 0.0.0.0:8443 maxconn 2048 send-proxy

启动HAproxy

  1. haproxy -f haproxy.cfg
  • Step 5. 配置BFE客户端证书文件存储路径(conf/bfe.conf),将root.crt复制到tls_conf/client_ca目录 注:根证书文件后缀名必须为.crt
  1. [Server]
  2. ...
  3. Layer4LoadBalancer = "PROXY"
  4. ...
  5. [HttpsBasic]
  6. ...
  7. ClientCABaseDir = tls_conf/client_ca
  8. ...

修改 conf/tls_conf_rule.data,将ClientAuth置为true,ClientCAName填写根证书文件名。

  1. {
  2. "Version": "12",
  3. "DefaultNextProtos": [
  4. "http/1.1"
  5. ],
  6. "Config": {
  7. "example_product": {
  8. "VipConf": [
  9. "127.0.0.1"
  10. ],
  11. "SniConf": null,
  12. "CertName": "example.org",
  13. "NextProtos": [
  14. "h2;rate=0;isw=65535;mcs=200;level=0",
  15. "http/1.1"
  16. ],
  17. "Grade": "C",
  18. "ClientAuth": true,
  19. "ClientCAName": "root"
  20. }
  21. }
  22. }

启动BFE

  1. ./bfe -c ../conf
  • Step 6. 验证配置
  1. openssl s_client -connect 127.0.0.1:7443 -cert client.crt -key client.key -state -quiet