使用场景

如果有一个业务系统,希望可以通过互联网从任意地方访问,同时从安全角度考虑,不希望谁都可以打开。可以使用HAProxy验证客户端证书的功能来实现。通过浏览器访问系统时,会弹出对话框,要求选择一个用户证书,只能提供合法的证书才能打开页面:

HAProxy验证客户端证书_HAProxy

如果没有提供证书将无法打开界面,效果如下:

HAProxy验证客户端证书_SSL_02

功能配置过程

使用要求

如果要使用验证客户端证书的功能,一定要使用HTTPS协议。同时要有一个PKI体系用于生成用户证书,关于PKI体系介绍及证书生成,请参考前期的文章。

HAProxy配置

在HAProxy验证客户证书的场景中,必须使用HTTPS方式,因此在这个场景中,需要在HAProxy中使用两个证书:服务器证书;用户证书PKI体系的根证书,具体配置如下:

frontend  http_https 
    bind *:443  ssl crt /etc/haproxy/cert/server.pem verify required ca-file /etc/haproxy/cert/ca.pem no-sslv3
    #/etc/haproxy/cert/server.pem 为服务器证书文件,包含服务器证书及私钥
    #verify required 表示需要验证客户端证书
    #/etc/haproxy/cert/ca.pem 指定 CA 文件,HAProxy 将使用它来验证客户端证书
    #服务器证书和用户证书可以使用不同的根CA,相互独立
    http-request return status 403  if ! { ssl_c_verify 0 }
    #表示完成没有通过证书验证返回403
    option                  httplog
    option forwardfor       except 127.0.0.0/8
    mode http
    http-request set-header X-SSL-Client-Serial %{+Q}[ssl_c_serial,hex]
    #在回源后端时,在http的头部插入用户证书的序列号
    http-request set-header X-SSL-Client-CN %{+Q}[ssl_c_s_dn(cn)]
    #插入用户证书的主题名
    http-request set-header X-SSL-Client-Verify %[ssl_c_verify]
    #插入验证结果
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

其它配置和普通场景HAProy的配置一样。

后端增强认证

一般场景下,客户端和HAProxy之间使用HTTPS传输,HAProxy和后端真实服务器之间使用HTTP传输,这就意味着后端服务器无法获取用户证书,所以需要HAProxy把用户证书的信息插入到http的头部中,由后端服务器处理这些信息。

根据上面的HAProxy配置,在http头部中会播入X-SSL-Client-Serial、X-SSL-Client-CN、X-SSL-Client-Verify三个字段:

HAProxy验证客户端证书_HAProxy_03

后端程序可以根椐这些字段进行进一步的用户验证。

客户端证书导入

用户证书生成

根据前期文章生成用户私钥及证书后,使用OpenSSL工具把私钥及证书打包成p12格式(PKCS #12,用于将公钥证书、私钥及相关信息打包加密):

openssl pkcs12 -export -inkey newton.key -in newton.crt -out newton.p12
  • 1.

其中 newton.crt 最好包含完整证书链路,即从用户证书到根CA全部包含,格式如下:

-----BEGIN CERTIFICATE-----
用户证书
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
中间CA证书,如果有多级中间CA,需要都包含
每个证书都以-----BEGIN CERTIFICATE-----开始,-----END CERTIFICATE-----结束
-----BEGIN CERTIFICATE-----
根CA证书
-----END CERTIFICATE-----
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

HAProxy验证客户端证书_HAProxy_04

因为p12文件包含用户的私钥,为保护私钥的安全,在打包的的过程中,需要输入p12文件的密码。

客户端证书导入

通过OpenSSL工具生成p12文件后,需要导入到浏览器中,用户浏览器向服务器提交证书验证。

在windows操作系统内,双击newton.p12文件,就可以进行证书导入,关键步骤如下:

HAProxy验证客户端证书_验证客户端证书_05

因为p12文件有密码,所以在导入时需要输入密码:

HAProxy验证客户端证书_HAProxy_06

在证书导入的过程中,一定要把证书保存到“个人”文件夹中:

HAProxy验证客户端证书_验证客户端证书_07

HAProxy验证客户端证书_SSL_08

导入完成后,就可以使用证书正常访问要求证书验证的网站。