通过NLB实现TCPSSL卸载(双向认证)

网络型负载均衡NLB(Network Load Balancer )支持大规模SSL卸载功能,您可以在流量入口部署NLB并配置SSL证书和CA证书,TCPSSL双向认证通过对通信双方做认证,为您的业务提供更高的安全性。

背景信息

  • 单向认证:客户端需要认证服务器端,而服务器端不需要认证客户端。客户端从服务器端请求服务器端公钥证书进行验证,然后建立安全通信通道。

  • 双向认证:客户端需要从服务器端请求服务器的公钥证书进行验证,同时还需要把客户端的公钥证书上传至服务器端进行验证,双方都通过认证,才能建立安全通信通道进行数据传输。因此双向认证可以为业务提供更高的安全性。

前提条件

  • 您已经创建NLB实例。具体操作,请参见创建和管理NLB实例

  • 您已创建3台ECS实例。具体操作,请参见自定义购买实例

    • ECS01和ECS02实例作为NLB实例的后端服务器,且ECS01和ECS02中部署了2个不同的应用服务。

      ECS01服务部署命令

      yum install -y nginx
      systemctl start nginx.service
      cd /usr/share/nginx/html/
      echo "Hello World ! This is ECS01." > index.html
      

      ECS02服务部署命令

      yum install -y nginx
      systemctl start nginx.service
      cd /usr/share/nginx/html/
      echo "Hello World ! This is ECS02." > index.html
      
    • ECS03实例用于生成自签的服务器证书和客户端证书,且ECS03已通过OpenSSL官网下载并安装了OpenSSL工具(1.1.1及以上版本)。您也可以使用已有的Linux服务器自签证书,这种情况下无需创建ECS03实例。

  • 您已创建后端协议为TCP的NLB服务器组,且该服务器组添加了后端服务器ECS01和ECS02。本文以ECS01和ECS02的后端端口均设置为80为例。

配置步骤

配置步骤

说明

本文分别提供了两种获取服务器证书和CA证书的方式,即证书中心购买和自签证书。您可以根据需要选择使用,例如NLB实例支持同时选择从阿里云购买的服务器证书与自签的CA证书。

步骤一:准备CA证书

本文为您介绍两种获取CA证书的方式。您可以通过证书中心购买CA证书并申请客户端证书和服务端证书,也可以上传自签CA证书至证书中心。

方式一:购买CA证书

  1. 登录数字证书管理服务控制台

  2. 在左侧导航栏,单击私有证书

  3. 私有证书页面,单击私有CA页签,找到目标根CA证书。

    关于如何购买目标根CA证书,请参见购买及启用私有CA

  4. 单击目标根CA证书前的icon图标,找到目标私有子CA,在操作列单击申请证书

  5. 申请证书面板,完成以下证书信息配置,然后单击确认申请

    此处仅列出和本文强相关的配置项。更多信息,请参见管理私有证书

    参数

    说明

    证书类型

    选择私有证书的证书类型。本文选择客户端证书

    公用名(CN)

    私有证书主体的通用名称。客户端证书支持填写用户邮箱地址或URL。

    本文填写已创建的NLB实例的域名。

    有效期

    私有证书的有效期。该有效期不能超过您购买的PCA服务的时长。

    本文默认显示30天。

    提交证书申请后,证书会立即签发。您可以在目标私有CA操作列单击证书列表,在证书列表页面查看已签发的证书信息,在操作列单击详情,在详情页。

方式二:上传自签CA证书

  1. 远程登录ECS03,执行以下命令,生成自签名根CA证书。关于如何登录ECS,请参见ECS远程连接操作指南

    NLB支持自签名根CA或自签名子根CA证书进行双向认证,本文以自签名根CA证书为例为您介绍。

    1. 执行以下命令,创建根CA证书私钥。

      sudo openssl genrsa -out root.key 4096
    2. 执行以下命令,创建根CA证书请求文件。

      sudo openssl req -new -out root.csr -key root.key

      后续参数请自行填写,示例如下:

      Country Name (2 letter code) [XX]:cn
      State or Province Name (full name) []:bj
      Locality Name (eg, city) [Default City]:bj
      Organization Name (eg, company) [Default Company Ltd]:alibaba
      Organizational Unit Name (eg, section) []:test
      Common Name (eg, your name or your servers hostname) []:root
      Email Address []:a.alibaba.com
      A challenge password []:
      An optional company name []:
      重要

      生成根证书时,除Common Name外,其余参数的值需与生成服务器证书和客户端证书时参数的值保持一致。建议根证书的Common Name设置为root。

    3. 执行以下命令,创建根CA证书。

      sudo openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 3650

      运行结果如下图所示:创建根证书

    4. 执行以下命令,创建一个存放根CA证书的文件目录。

      sudo mkdir -p /root/ca
    5. 执行以下命令,将根CA证书复制到目标文件目录下。

      sudo cp root.crt /root/ca
      sudo cp root.key /root/ca
    6. 执行以下命令查看生成的根CA证书root.crt和根CA证书私钥root.key

      sudo cd /root/ca
      ls

      运行结果如下图所示:客户端证书

  2. 在本地打开命令行窗口,执行以下命令导出生成的根CA证书文件至本地文件夹。本文以Windows客户端为例。

    scp root@IPaddress:/root/ca/root.crt  /C:/Users/test    //IPaddress是生成根CA证书的服务器的IP地址
    scp root@IPaddress:/root/ca/root.key  /C:/Users/test    //IPaddress是生成根CA证书的服务器的IP地址

    根据提示输入生成根CA证书的服务器的密码。

  3. 登录数字证书管理服务控制台

  4. 在左侧导航栏,单击证书应用仓库

  5. 证书应用仓库页面,单击创建仓库

  6. 创建仓库面板,配置以下参数,然后单击确定

    配置项

    说明

    仓库名称

    自定义仓库名称。

    数据来源

    本文选择上传CA证书,表示对通过第三方证书服务商购买并签发的私有CA证书进行管理。

  7. 证书应用仓库页面,单击目标证书仓库。

  8. 证书管理页面,单击上传证书

  9. CA信息面板,参考下表配置,单击确认并启用

    配置项

    说明

    名称

    为要上传的私有证书设置一个名称。

    CA文件

    本文选择上传步骤2导出的根CA证书root.crt文件。

步骤二:准备服务器证书

您可以通过浏览器检查服务器发送的证书是否是由自己信赖的中心签发的。本文为您介绍两种获取服务器证书的方式。您可以通过证书中心购买服务器证书,也可以上传自签服务器证书至证书中心。

方式一:购买服务器证书

您可以从阿里云数字证书管理服务控制台购买服务器证书或者向其他服务商处购买。关于如何购买服务器证书,请参见购买SSL证书

方式二:自签服务器证书

  1. 远程登录ECS03,执行以下命令,生成自签名服务器证书。生成自签名服务器证书时,请确保ECS03已保存CA证书,本文中CA证书文件为root.crtroot.key

    1. 执行以下命令,生成服务器端证书私钥。

      sudo openssl genrsa -out server.key 4096
    2. 执行以下命令,生成服务器证书请求文件。

      sudo openssl req -new -out server.csr -key server.key

      后续参数请自行填写,示例如下:

      Country Name (2 letter code) [XX]:cn
      State or Province Name (full name) []:bj
      Locality Name (eg, city) [Default City]:bj
      Organization Name (eg, company) [Default Company Ltd]:alibaba
      Organizational Unit Name (eg, section) []:test
      Common Name (eg, your name or your servers hostname) []:www.example.com
      Email Address []:a.alibaba.com
      A challenge password []:
      An optional company name []:
      重要

      生成服务器证书时,Common Name需输入服务器证书绑定的域名,请确保该域名真实可用。其余参数与生成根证书和客户端证书时参数的值保持一致。

      本文NLB实例通过DNS解析的自定义域名www.example.com对外提供服务,Common Name输入DNS解析的自定义域名www.example.com

    3. 执行以下命令,生成服务器端公钥证书。

      sudo openssl x509 -req -in server.csr -out server.crt -signkey server.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650

      运行结果如下图所示:生成服务器证书

    4. 执行以下命令,创建一个存放服务器证书的文件目录。

      sudo mkdir -p /root/ssl
    5. 执行以下命令,将服务器证书复制到目标文件目录下。

      sudo cp server.crt /root/ssl
      sudo cp server.key /root/ssl
    6. 执行以下命令查看生成的服务器证书server.crt和服务器证书私钥server.key

      sudo cd /root/ssl
      ls

      运行结果如下图所示:查看服务器证书

  2. 以Windows客户端为例说明。打开Windows客户端的命令行窗口,执行以下命令导出步骤1生成的服务器证书文件至本地文件夹。

    scp root@IPaddress:/root/ssl/server.crt  /C:/Users/test    //IPaddress是生成根CA证书的服务器的IP地址
    scp root@IPaddress:/root/ssl/server.key  /C:/Users/test    //IPaddress是生成根CA证书的服务器的IP地址
  3. 登录数字证书管理服务控制台

  4. 在左侧导航栏,单击SSL 证书

  5. SSL证书页面的上传证书页签,单击上传证书

  6. 上传证书面板,完成以下参数的配置,单击确定

    更多信息,请参见上传和共享SSL证书

    参数

    说明

    证书标准

    本文选择国际标准

    证书名称

    为要上传的证书设置一个名称。

    证书文件

    填写证书文件内容的PEM编码。

    您可以使用文本编辑工具打开PEM或者CRT格式的证书文件,复制其中的内容并粘贴到该文本框,或者单击该文本框下的上传,并选择存储在本地计算机的证书文件,将文件内容上传到文本框。

    本文选择上传导出的服务器证书server.crt文件。

    证书私钥

    填写证书私钥内容的PEM编码。

    您可以使用文本编辑工具打开KEY格式的证书私钥文件,复制其中的内容并粘贴到该文本框,或者单击该文本框下的上传并选择存储在本地计算机的证书私钥文件,将文件内容上传到文本框。

    本文选择上传导出的服务器证书私钥server.key文件。

    证书链

    证书链编码。本文不做配置。

步骤三:准备客户端证书

您可以根据实际情况选择以下一种方式准备客户端证书。

方式一:导出通过控制台购买的客户端证书

  1. 登录数字证书管理服务控制台

  2. 在左侧导航栏,单击私有证书

  3. 私有证书页面,单击私有CA页签,找到目标根CA证书。

    关于如何购买目标根CA证书,请参见购买及启用私有CA

  4. 单击目标根CA证书前的icon图标,找到目标子CA证书,在操作列单击证书列表

  5. 证书列表页面,定位到目标私有证书,在操作列,单击下载

    说明

    如果您申请的是合规CA证书,且私钥算法为SM2,密钥容器为USBKey,则该私有证书不支持下载。

  6. 证书下载对话框,选择需要下载的证书格式,单击确认并下载。本文选择CRT格式,下载完成后,客户端证书为client.crt,客户端私钥为client.key

  7. 将客户端证书转换为浏览器可以识别的PKCS12文件。

    1. 远程登录ECS03,具体操作,请参见ECS远程连接操作指南

    2. 执行以下命令创建一个存放客户端证书的文件目录。

      sudo mkdir -p /root/ca/users
    3. 将生成的客户端证书client.crt和私钥client.key上传到users目录下。

    4. 执行以下命令将客户端证书转化为PKCS12文件。

      sudo openssl pkcs12 -export -clcerts -in /root/ca/users/client.crt -inkey /root/ca/users/client.key -out /root/ca/users/client.p12
    5. 按照提示设置客户端私钥加密密码。

    6. 输入用于导出证书的密码。此密码为客户端证书的保护密码,在安装客户端证书时需要输入该密码。

      运行结果如下图所示:P12

  8. 执行以下命令查看生成的客户端证书。

    sudo cd /root/ca/users
    ls

    运行结果如下图所示:客户端证书

  9. 以Windows客户端为例说明。在本地打开命令行窗口,执行以下命令导出生成的客户端证书。

    scp root@IPaddress:/root/ca/users/client.p12 ./          //IPaddress是生成客户端证书的服务器的IP地址

方式二:导出通过自签证书生成的客户端证书

如果您已上传自签CA证书至证书中心,并需要自签CA证书生成的客户端证书进行双向认证,请执行以下操作生成客户端证书。

  1. 远程登录ECS03,执行以下步骤,生成客户端证书。关于如何登录ECS,请参见ECS远程连接操作指南

    1. 执行以下命令,生成客户端证书密钥。

      sudo openssl genrsa -out client.key 4096
    2. 执行以下命令,生成客户端证书请求文件。

      sudo openssl req -new -out client.csr -key client.key

      后续参数请自行填写,示例如下:

      Country Name (2 letter code) [XX]:cn
      State or Province Name (full name) []:bj
      Locality Name (eg, city) [Default City]:bj
      Organization Name (eg, company) [Default Company Ltd]:alibaba
      Organizational Unit Name (eg, section) []:test
      Common Name (eg, your name or your servers hostname) []:XX.XX.XX.XX   //XX.XX.XX.XX替换为客户端IP地址
      Email Address []:a.alibaba.com
      A challenge password []:
      An optional company name []:
      重要

      生成客户端证书时,除Common Name外,其余参数的值需与生成根证书和服务器证书时参数的值保持一致。建议客户端证书的Common Name设置为客户端IP。

    3. 执行以下命令,生成客户端证书。

      sudo openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650
    4. 执行以下命令,将生成的客户端证书client.crt转换为浏览器可以识别的PKCS12文件。

      sudo openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
    5. 按照提示输入设置的客户端私钥加密密码。

    6. 执行以下命令,将根CA证书复制到目标文件的目录下。

      sudo cp client.p12 /root/ca
    7. 执行以下命令查看生成的客户端证书。

      sudo cd /root/ca
      ls

      运行结果如下图所示:客户端证书02

  2. 以Windows客户端为例说明。在本地打开命令行窗口,执行以下命令导出客户端证书至本地文件夹。

    scp root@IPaddress:/root/ca/client.p12  /C:/Users/test    //IPaddress是生成根CA证书的服务器的IP地址

    根据提示输入生成根CA证书的服务器的密码。

步骤四:安装客户端证书

将生成的客户端证书安装至客户端,本文以Windows客户端和Linux客户端为例进行说明。

Windows客户端

在Microsoft Edge浏览器中导入下载的客户端证书。

  1. 打开Microsoft Edge浏览器,选择... > 设置

  2. 在左侧导航栏,单击隐私、搜索和服务页签,然后在安全性模块找到并单击管理证书,导入下载的PKCS12文件。在导入证书时需要输入步骤三:导出客户端证书导出证书的密码。安装客户端证书

Linux客户端

使用ECS03服务器生成客户端证书后,ECS03服务器的目录中已存在该客户端证书。如需在其他Linux客户端验证NLB双向认证,请先执行以下步骤,将双向认证相关证书复制至该Linux客户端目录下。

  1. 登录一台Linux客户端。执行以下命令,将客户端证书、服务器证书和根证书复制至某个目录下。

    1. 创建文件夹。

      sudo mkdir /root/ca
    2. 修改目录权限。

      sudo chmod 700 /root/ca
    3. 分别执行以下命令,复制证书文件至当前Linux客户端目录下。

      以下路径仅供参考,请以实际操作路径为准。

      sudo scp home@IPaddress:/root/ca/client.crt /root/ca     //IPaddress是生成客户端证书的服务器的IP地址
      sudo scp home@IPaddress:/root/ca/root.crt /root/ca       //IPaddress是生成根证书的服务器的IP地址
      sudo scp home@IPaddress:/root/ca/root.key /root/ca       //IPaddress是生成根证书的服务器的IP地址
      sudo scp home@IPaddress:/root/ssl/server.crt /root/ca     //IPaddress是生成服务器证书的服务器的IP地址
      sudo scp home@IPaddress:/root/ssl/server.crt /root/ca     //IPaddress是生成服务器证书的服务器的IP地址

步骤五:配置TCPSSL监听的双向认证

  1. 登录网络型负载均衡NLB控制台
  2. 在顶部菜单栏,选择NLB实例的所属地域。

  3. 实例页面,找到目标实例,在操作列单击创建监听

  4. 配置监听配置向导,完成以下参数的配置,然后单击下一步

    此处仅列出和本文强相关的配置项,其他未列出的配置项使用默认值。更多信息,请参见添加TCPSSL监听

    配置

    说明

    选择监听协议

    选择一种监听协议。本文选择TCPSSL

    监听端口

    输入用来接收请求并向后端服务器进行请求转发的监听端口。本文输入443

  5. 配置SSL证书配置向导,在选择服务器证书下拉框中选择步骤二:准备服务器证书购买或上传的服务器证书。

  6. 开启高级配置中的启用双向认证开关,根据实际情况选择CA证书来源

    • 选择CA证书来源为阿里云签发,在选择默认CA证书下拉框中选择步骤一:准备CA证书购买的CA证书。

    • 选择CA证书来源为非阿里云签发,在选择默认CA证书下拉框中选择步骤一:准备CA证书上传的自签CA证书。

  7. 选择TLS安全策略,然后单击下一步

  8. 选择服务器组配置向导,选择已创建的服务器组,查看后端服务器ECS01和ECS02的信息,本文端口号均设置为80,然后单击下一步

  9. 配置审核配置向导,确认配置信息,单击提交

步骤六:验证TCPSSL双向认证

Windows客户端

  1. 返回NLB实例页面,单击目标NLB实例ID,然后单击监听页签,查看TCPSSL监听的健康检查状态。

    健康检查状态列为正常时,表示后端服务器可以正常接收处理NLB的TCPSSL监听转发的请求。

  2. 在浏览器中输入https://服务器证书绑定的域名命令,例如https://www.example.com,在弹出的对话框中选中用于验证客户端身份的证书,单击确定访问NLB实例

  1. 由于浏览器缓存问题,验证四层负载均衡时,建议您每次使用无痕浏览器访问DNS域名,可以观察到请求已分发至两台ECS。验证双向认证图1验证双向认证图2

Linux客户端

登录已保存了根证书、服务器证书和客户端证书的Linux客户端,执行以下命令验证NLB双向认证。

sudo curl --cert /root/ca/client.crt --key /root/ca/client.key --cacert /root/ca/root.crt www.example.com

www.example.com为NLB实例服务器证书绑定的域名。

收到如下所示的回复报文,则表示客户端和服务端已完成双向认证,并将请求分发至两台ECS。验证1