更新时间:2023-11-25 GMT+08:00

HTTPS双向认证

使用场景

一般的HTTPS业务场景只对服务器做认证,因此只需要配置服务器的证书即可。某些关键业务(如银行支付),需要对通信双方的身份都要做认证,即双向认证,以确保业务的安全性。

此时,除了配置服务器的证书之外,还需要配置客户端的证书,以实现通信双方的双向认证功能。

本章节以自签名证书为例,介绍如何配置HTTPS双向认证。但是自签名证书存在安全隐患,建议购买权威机构颁发的证书。

使用OpenSSL制作CA证书

  1. 登录到任意一台安装有openssl工具的Linux机器。
  2. 创建工作目录并进入该目录。

    mkdir ca

    cd ca

  3. 创建CA证书的openssl配置文件ca_cert.conf,内容如下:
    [ req ]
    distinguished_name     = req_distinguished_name
    prompt                 = no
     
    [ req_distinguished_name ]
     O                      = ELB
  4. 创建CA证书私钥文件ca.key。

    openssl genrsa -out ca.key 2048

    图1 生成CA证书私钥文件
  5. 创建CA证书的csr请求文件ca.csr。

    openssl req -out ca.csr -key ca.key -new -config ./ca_cert.conf

  6. 创建自签名的CA证书ca.crt。

    openssl x509 -req -in ca.csr -out ca.crt -sha1 -days 5000 -signkey ca.key

    图2 创建自签名CA证书

使用CA证书签发服务器证书

用户可以用权威CA签发的证书或者自签名的证书,这里以自签名证书为例说明如何创建服务器证书。

  1. 登录到生成CA证书的服务器。
  2. 创建与CA平级的目录,并进入该目录。

    mkdir server

    cd server

  3. 创建服务器证书的openssl配置文件server_cert.conf,内容如下:
    [ req ]
    distinguished_name     = req_distinguished_name
    prompt                 = no
     
    [ req_distinguished_name ]
     O                      = ELB
     CN                     = www.test.com

    CN字段可以根据需求改为服务器对应的域名、IP地址。

  4. 创建服务器证书私钥文件server.key。

    openssl genrsa -out server.key 2048

  5. 创建服务器证书的csr请求文件server.csr。

    openssl req -out server.csr -key server.key -new -config ./server_cert.conf

  6. 使用CA证书签发服务器证书server.crt。

    openssl x509 -req -in server.csr -out server.crt -sha1 -CAcreateserial -days 5000 -CA ../ca/ca.crt -CAkey ../ca/ca.key

    图3 签发服务器证书

使用CA证书签发客户端证书

  1. 登录到生成CA证书的服务器。
  2. 创建与CA平级的目录,并进入该目录。

    mkdir client

    cd client

  3. 创建客户端证书的openssl配置文件client_cert.conf,内容如下:
    [ req ]
    distinguished_name     = req_distinguished_name
    prompt                 = no
     
    [ req_distinguished_name ]
     O                      = ELB
     CN                     = www.test.com

    CN字段可以根据需求改为对应的域名、IP地址。

  4. 创建客户端证书私钥文件client.key。

    openssl genrsa -out client.key 2048

    图4 创建客户端证书私钥文件
  5. 创建客户端证书的csr请求文件client.csr。

    openssl req -out client.csr -key client.key -new -config ./client_cert.conf

    图5 创建客户端证书csr文件
  6. 使用CA证书签发客户端证书client.crt。

    openssl x509 -req -in client.csr -out client.crt -sha1 -CAcreateserial -days 5000 -CA ../ca/ca.crt -CAkey ../ca/ca.key

    图6 签发客户端证书
  7. 把客户端证书格式转为浏览器可识别的p12格式。

    openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12

    该命令执行时需要输入导出密码,请输入并记住该密码,在证书导入浏览器时需要使用。

配置服务器证书和私钥

  1. 登录负载均衡控制台页面。
  2. 单击“证书管理 > 创建证书”。
  3. 在创建证书页面,证书类型选择“服务器证书”,同时把前面生成的服务器证书server.crt以及私钥server.key的内容复制到对应的区域,单击“确定”按钮。

    复制内容时请将最后的换行符删除,避免保存时报错。

    图7 创建证书

    服务器证书和私钥内容只支持上传pem格式。

配置CA证书

  1. 登录负载均衡控制台页面。
  2. 单击“证书管理 > 创建证书”。
  3. 在创建证书页面,证书类型选择“CA证书”,同时把使用OpenSSL制作CA证书创建的客户端CA证书ca.crt的内容复制到证书内容区域,单击“确定”按钮。

    复制内容时请将最后的换行符删除,避免保存时报错。

    图8 创建证书

    CA证书内容只支持上传pem格式。

配置HTTPS双向认证

  1. 登录负载均衡控制台页面。
  2. 在添加监听器页面,协议类型选择“HTTPS”,打开双向认证开关,并且在服务器证书和CA证书两个配置项中选择所添加的服务器证书和CA证书对应的名称。

添加后端服务器

请参考后端服务器相关操作指导,此处不展开描述。

导入客户端证书并测试

浏览器方式功能测试

  1. 浏览器导入客户端证书(以Internet Explorer 11为例说明)
    1. 把客户端证书从Linux机器导出来,即前面签发的client.p12证书文件。
    2. 单击“设置 > Internet选项”,切换到“内容”页签。
    3. 单击“证书”,然后单击“导入”,导入client.p12证书文件。
      图9 安装client.p12证书
  2. 测试验证
    在浏览器中输入地址,浏览器会弹出证书选择窗口,如下,选择客户端证书,然后点确定按钮,可以正常访问网站,如图12 正常访问网站
    图10 正常访问网站

Curl工具方式功能测试

  1. 导入客户端证书

    把客户端证书client.crt和客户端私钥文件client.key拷贝到新目录,如目录/home/client_cert。

  2. 测试验证
    在shell界面,输入以下命令,请输入正确的证书地址和密钥文件地址,以及负载均衡器的IP地址和监听器端口(以下用https://XXX.XXX.XXX.XXX:XXX 表示,以实际IP地址和端口为准)。
    curl -k --cert /home/client_cert/client.crt --key /home/client_cert/client.key https://XXX.XXX.XXX.XXX:XXX/ -I

    如果可以正确获得响应码,如图11说明验证成功。

    图11 正确响应码示例