应用场景
当您的业务系统部署在云上并通过ELB对外提供服务时,在ELB上进行双向认证确保了访问客户端的身份安全并降低了在后端服务器进行认证的开发和维护成本。
然而在部分应用层业务授权、个性化定制业务和有较高安全要求的审计场景,后端服务器仍然需要获取请求客户端的身份信息。通过在ELB的监听器上配置请求头获取客户端证书数据信息并传递到转发给后端服务器的报文中,可以在不增加后端服务器业务负担的情况下,使得后端服务可以获取请求客户端的证书信息并进行更精细的安全控制。
该功能陆续上线中,已发布区域请以控制台实际为准。如果您有使用需求,可以提交工单进行申请。
准备工作
- 已创建独享型ELB实例,且ELB已绑定EIP。具体操作,请参见购买独享型负载均衡器和绑定IPv4公网IP。
- 已创建协议类型为HTTPS协议的后端服务器组。服务器组中添加了ECS01实例,并且在ECS01中部署了应用服务。
- 创建两台ECS,ECS与已创建的ELB实例属于同一个VPC,更多详细设置请参考快速创建ECS,本实践方案以ECS安装CentOS系统为例。第一台ECS_client用作客户端发送请求,第二台ECS_server用作部署后端应用的后端服务器。
- 为ELB准备证书:
- 已购买证书或者上传第三方证书到SSL证书服务并绑定公网域名。推荐您在华为云云证书管理服务购买服务器证书,详情请参见购买SSL证书。
- 已购买CA证书并导出CA证书文件至本地或者直接使用自签名的CA证书。推荐您在华为云云证书管理服务购买CA证书并导出私有CA证书到您的本地环境,详情请参见购买私有CA和导出私有CA证书。
- 为客户端准备证书:通过华为云云证书管理服务创建并激活私有CA后,您就可以通过私有CA申请私有证书并配置到客户端。
步骤一:上传服务器证书到ELB控制台
在ELB添加HTTPS监听器前,您需要将您的证书上传到将ELB控制台。
- 进入弹性负载均衡列表页面。
- 在左侧导航栏单击“证书管理”。
- 单击“创建证书”,配置参数请参见表1。
表1 服务器证书参数说明
参数 |
说明 |
证书类型 |
创建证书的类型,本文选择服务器证书。 |
证书来源 |
服务器证书同时支持SSL证书管理服务提供的数字证书和您的自有证书。
本文选择“SSL证书管理”以同步您在华为云云证书管理服务已经购买的SSL证书。 |
证书 |
选择您需要上传到ELB控制台的证书。 |
企业项目 |
企业项目是一种云资源管理方式,企业项目管理服务提供统一的云资源按项目管理,以及项目内的资源管理、成员管理。 |
SNI扩展域名(可选) |
将自动同步SSL证书已绑定的所有域名。
当您的证书用于配置SNI证书时,将支持根据客户端HTTPS请求的域名来选择对应的SNI证书完成认证。 |
描述 |
添加对该证书的描述信息,非必填项。 |
- 单击“确定”,完成创建。
步骤二:上传CA证书到ELB控制台
在ELB添加HTTPS监听器前,您需要将您的CA证书上传到ELB控制台。
- 进入弹性负载均衡列表页面。
- 在左侧导航栏单击“证书管理”。
- 单击“创建证书”,配置参数请参见表2。
表2 CA证书参数说明
参数 |
说明 |
证书类型 |
创建证书的类型,本文选择CA证书。 |
证书名称 |
您的CA证书名称。 |
企业项目 |
企业项目是一种云资源管理方式,企业项目管理服务提供统一的云资源按项目管理,以及项目内的资源管理、成员管理。 |
证书内容 |
证书内容必须为PEM格式。
单击“上传”,上传您本地的CA证书文件,请确保您的浏览器是最新版本。
证书内容格式如下:
-----BEGIN CERTIFICATE-----
Base64–encoded certificate
-----END CERTIFICATE----- |
描述 |
添加对该证书的描述信息,非必填项。 |
- 单击“确定”,完成创建。
步骤三:创建HTTPS监听器并配置获取客户端证书数据信息
- 进入弹性负载均衡列表页面。
- 在目标弹性负载均衡实例的操作列,单击“添加监听器”。
- 在添加监听器页面,进行如下配置。
- 协议类型:选择“HTTPS”。
- 证书配置:
- “SSL解析方式”选择“双向认证”。
- 在服务器证书的配置项中选择步骤一中上传到ELB控制台的服务器证书。
- 在CA证书的配置项中选择步骤二中上传到ELB控制台的CA证书。
图1 添加HTTPS证书配置双向认证
- 附加HTTP头字段:
- 单击展开“更多配置(可选)”。
- 单击展开“附加HTTP头字段”下的“客户端证书数据信息”。
- 勾选需要添加到转发至后端服务器报文中的证书信息,并输入重写后对应的header头字段名称。
输入字符仅支持小写英文字母、数字、下划线和中划线。
图2 获取客户端证书数据信息
- 单击“下一步:配置后端分配策略”,后端服务器组参数选择“使用已有”。选择已经创建完成的服务器组,完成后单击“下一步:确认配置”。
- 确认配置参数后,单击“提交”,完成HTTPS监听器的创建。
步骤四:在后端服务器中部署应用程序
- 远程登录后端服务器ECS_server。
弹性云服务器有多种登录方法,具体请参见登录弹性云服务器。
- 请确保服务器端的python版本不低于python 3。
- 在后端服务器中,新建目录Test。
mkdir Test
- 在Test目录下,新建一个server.py文件,并且在其中部署应用服务打印出后端服务器收到的请求头。
- 新建server.py文件。
vi server.py
- 按i键进入编辑模式。
- server.py文件脚本。
import http.server
import socketserver
import logging
from datetime import datetime
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(message)s',
handlers=[
logging.FileHandler('app.log', mode='a'),
logging.StreamHandler()
]
)
class HeaderLoggerHTTPHandler(http.server.BaseHTTPRequestHandler):
def do_GET(self):
self.log_headers()
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()
self.wfile.write(b"Headers logged to app.log")
def log_headers(self):
headers = {k: v for k, v in self.headers.items()}
logging.info(f"{self.command} Request from {self.client_address[0]}")
for key, value in headers.items():
logging.info(f"Header: {key} = {value}")
if __name__ == '__main__':
PORT = 443
with socketserver.TCPServer(("", PORT), HeaderLoggerHTTPHandler) as httpd:
print(f"Server started at http://localhost:{PORT}")
print(f"Headers will be logged to app.log")
try:
httpd.serve_forever()
except KeyboardInterrupt:
print("\nServer stopped")
- 按Esc键,输入:wq保存server.py文件。
- 运行server.py文件。
python3 server.py
- 收到如图3的回显,表示后端服务部署成功。
图3 后端服务启动成功
步骤五:从客户端访问后端服务
- 远程登录客户端ECS_client。
- 将准备工作中已下载至本地的私有证书client.crt和私钥文件client.key上传至客户端。
上传详情您可以参考上传文件到云服务器。
- 在客户端通过curl命令指定客户端证书文件和与客户端证书配对的私钥文件访问后端服务。
- 用于进行双向认证通信的curl命令语句。
curl -k --cert <certificate> --key <private.key> https://<公网IP地址或域名>
--cert <certificate>:指定客户端的证书文件,用于完成客户端的身份认证。
--key <private.key>:指定与客户端证书相对应的私钥文件,用于与客户端证书配合使用完成认证。
https://<公网IP地址或域名>:指定客户端将要访问的目标地址。
本实践方案使用如下语句访问后端服务:
curl -k --cert ./client.crt --key ./client.key https://<ELB的EIP地址>
图4 通过curl命令访问后端服务
步骤六:验证服务端获取到客户端证书数据信息
- 远程登录客户端ECS_server。
- 在后端服务打印的header头中可以看到客户端证书相关的信息。
图5 验证服务端获取到客户端证书信息