Haproxy SSL 双向认证

准备工作

  1. openssl目录准备

    一般情况下openssl的配置文件都在这个目录/etc/pki/tls

    mkdir /etc/pki/t2cloud
    cd /etc/pki/t2cloud
    mkdir root server client newcerts
    echo 01 > serial
    echo 01 > crlnumber
    touch index.txt
    
  2. openssl配置准备

    修改openssl配置,vi /etc/pki/tls/openssl.cnf

    • 找到这句注释掉,替换为下面那句

      #default_ca      = CA_default
      default_ca      = CA_t2cloud
      
    • 把整个部分拷贝一份,改成上面的名字[ CA_t2cloud ]

      修改里面的如下参数,保存退出:

      dir = /etc/pki/t2cloud
      certificate = $dir/root/ca.crt
      private_key = $dir/root/ca.key
      

创建CA根证书

  1. 生成key:

    openssl genrsa -out /etc/pki/t2cloud/root/ca.key 1024 -passout pass:[email protected]
    
  2. 生成crt:

    openssl req -x509 -new -key /etc/pki/t2cloud/root/ca.key -out /etc/pki/t2cloud/root/ca.crt -days 36500  -subj "/C=CN/ST=BJ/L=BEIJING/O=T2Cloud/OU=T2Cloud/CN=192.168.103.80" -passout pass:[email protected]
    

创建server证书

  1. 生成key:

    openssl genrsa -out /etc/pki/t2cloud/server/server.key 1024 -passout pass:[email protected]
    
  2. 生成csr:

    openssl req -new -key /etc/pki/t2cloud/server/server.key -out /etc/pki/t2cloud/server/server.csr -passin pass:[email protected] -subj "/C=CN/ST=BJ/L=BEIJING/O=T2Cloud/OU=T2Cloud/CN=192.168.103.80"
    
  3. 生成crt:

    openssl x509 -req -in /etc/pki/t2cloud/server/server.csr -CA /etc/pki/t2cloud/root/ca.crt -CAkey /etc/pki/t2cloud/root/ca.key -CAcreateserial -days 3650 -set_serial 01 -out /etc/pki/t2cloud/server/server.crt
    
  4. 合并为Haproxy使用的证书:

    cat /etc/pki/t2cloud/server/server.key /etc/pki/t2cloud/server/server.crt | tee /etc/pki/t2cloud/server/server-allinone.pem
    

创建client证书

  1. 生成key:

    openssl genrsa -des3 -out /etc/pki/t2cloud/client/client.key 1024 -passout pass:[email protected]
    
  2. 生成csr:

    openssl req -new -key /etc/pki/t2cloud/client/client.key -out /etc/pki/t2cloud/client/client.csr -passin pass:[email protected] -subj "/C=CN/ST=BJ/L=BEIJING/O=T2Cloud/OU=T2Cloud/CN=192.168.103.80"
    
  3. 生成crt:

    openssl ca -in /etc/pki/t2cloud/client/client.csr -cert  /etc/pki/t2cloud/root/ca.crt -keyfile /etc/pki/t2cloud/root/ca.key -days 3650 -out /etc/pki/t2cloud/client/client.crt
    
  4. 生成浏览器使用证书:

    openssl pkcs12 -export -in /etc/pki/t2cloud/client/client.crt -inkey /etc/pki/t2cloud/client/client.key -out /etc/pki/t2cloud/client/client.p12 -passin pass:[email protected] -passout pass:[email protected] -name t2client
    

配置Haproxy

frontend web
    bind 192.168.103.80:443 ssl crt /etc/pki/t2cloud/server/server-allinone.pem ca-file /etc/pki/t2cloud/root/ca.crt verify required
    default_backend vue-web

backend vue-web
    mode tcp
    balance roundrobin
    server vue-1 xxx.xxx.xxx.xxx weight 1 maxconn 1500 inter 2000 check

测试

由于是双向认证,直接通过浏览器访问https地址是被告知:

不接受您的登录证书,或者您可能没有提供登录证书。请尝试联系系统管理员。(ERR_BAD_SSL_CLIENT_AUTH_CERT)

需要在本机安装client证书。安装时会提示输入生成证书时设置的密码。安装成功后,重启浏览器输入网址访问,浏览器可能会提示你选择证书,选择刚才安装的那个证书即可。

问题

  1. 创建多套client证书时,报错:openssl TXT_DB error number 2 failed to update database

    有如下三种方式:

    • 删除/etc/pki/tls/t2cloud下的index.txt,并再touch下

    • 将 common name设置成不同的

    • 将 index.txt.attr中unique_subject = yes改为unique_subject = no