HTTPS双向认证机制保证服务器端与客户端能互相验证对方的身份。在银行与金融服务、物联网、企业内部服务或政府服务等涉及大量隐私信息的场景中,您可以通过HTTPS双向认证机制保证信息安全。
HTTPS单向与双向认证的对比
使用HTTPS单向认证:客户端从服务器端下载服务器端的SSL/TLS证书进行认证,然后建立安全通信通道。服务器端无法认证客户端的身份。
使用HTTPS双向认证:客户端从服务器端下载服务器端的SSL/TLS证书进行认证,同时客户端还需要向服务器端提供自己的SSL/TLS证书进行认证。当双方都认证过对方的身份后,才能建立安全通信通道进行数据传输。通常情况下,服务器端持有根CA证书,而客户端的SSL/TLS证书基于此根CA证书签发,因此服务器端可以认证客户端的身份。使用HTTPS双向认证可以使服务只对受信任的客户端开放,可以有效防止中间人攻击,提升了服务的安全性。
前提条件
已参见配置HTTPS证书以实现加密通信配置HTTPS证书。
已获取根CA证书。您可以从以下几个途径获取:
从阿里云数字证书中心购买证书。具体操作,请参见购买及启用私有CA。
参照本文中的(可选)步骤生成自签名证书。
(可选)步骤一:生成自签根CA证书
如果您还未获取根CA证书,请参照以下步骤生成证书并上传至阿里云数字证书中心。
执行以下命令,创建根CA证书私钥。
openssl genrsa -out ca.key 4096
执行以下命令,创建根CA证书请求文件。
openssl req -new -out ca.csr -key ca.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 []:
CA证书的相关参数说明如下所示。
参数
说明
Country Name
(必填)国家代码,通常是两个字母,比如cn代表中国。
State or Province Name
(必填)省份/自治区信息。
Locality Name
(必填)城市名称。
Organization Name
(必填)组织名称,如公司名称。
Organizational Unit Name
(必填)组织单位名称。
Common Name
(选填)常用名称。
Email Address
(选填)电子邮件地址,可用于联系证书的管理员。
A challenge password
(选填)可设置密码来增加证书请求(CSR)的安全性。本示例未设置密码。
An optional company name
(选填)可选的公司名称。本示例未设置。
执行以下命令,创建根CA证书。
openssl x509 -req -in ca.csr -out ca.crt -signkey ca.key -CAcreateserial -days 3650
完成上述操作后,执行
ls
命令,即可在当前目录中看到根证书私钥和证书。ca.crt ca.csr ca.key
ca.crt是一个证书颁发机构的根证书文件,ca.csr文件是您的CA证书请求文件,ca.key是您的私钥。步骤7中,您将会上传ca.key和ca.crt文件用来设置自签的根CA证书。
重要私钥属于敏感信息,请不要轻易泄露。
登录数字证书管理服务控制台,在左侧导航栏,单击证书应用仓库。
在证书应用仓库页面,单击创建仓库,在创建仓库面板,配置以下参数,然后单击确定。
配置项
说明
仓库名称
自定义仓库名称。
数据来源
本文选择上传证书,表示对通过第三方证书服务商购买并签发的私有证书进行管理。
在证书应用仓库页面,单击上一步创建的目标证书仓库,然后在证书管理页面,单击上传证书。
在CA信息面板,参考下表配置,上传步骤3创建的CA证书,然后单击确认并启用。
配置项
说明
名称
为要上传的私有证书自定义名称。
证书文件
填写私有证书文件内容的PEM编码。
您可以使用文本编辑工具打开PEM或者CRT格式的私有证书文件,复制其中的内容并粘贴到该文本框,或者单击该文本框下的上传,并选择存储在本地计算机的私有证书文件,将文件内容上传到文本框。
证书私钥
填写私有证书私钥内容的PEM编码。
步骤二:生成客户端证书
客户端证书您可以在控制台购买,也可以通过自签的CA来签发客户端证书。
本文介绍如何通过步骤一的自签CA证书签发客户端证书,并在创建监听后,使用自签客户端证书和服务器完成双向认证。
执行以下命令,生成客户端证书密钥。
openssl genrsa -out client.key 4096
执行以下命令,生成客户端证书请求文件。
openssl req -new -out client.csr -key client.key
执行以下命令,生成客户端证书。
openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650
CA和CAkey指向步骤一创建的根证书。
完成上述操作后,执行
ls
命令,即可在当前目录中看到生成的客户端证书。client.crt client.csr client.key
步骤三:使用Albconfig创建双向认证监听
将步骤一中创建的服务器证书Certificates,填写到Albconfig的Certificates字段,作为服务器的默认证书。
登录数字证书管理服务控制台,在左侧导航栏,单击SSL证书。
在SSL证书页面,在目标证书的操作栏单击,然后选择详情。
在证书详情面板,即可查看证书的Certificates。
将步骤一中创建的根证书Identifier,填写到Albconfig的CaCertificates对应的CertificateId处。
登录数字证书管理服务控制台,在左侧导航栏,单击证书应用仓库。
在证书应用仓库页面,单击目标证书仓库,然后在证书管理页面,单击详情。
在证书详情面板,即可查看证书的Identifier。
Albconfig的配置示例如下:
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb-demo
spec:
config:
name: alb-test
addressType: Intranet
# 您需要至少指定两个不同可用区交换机ID,指定的交换机必须在ALB当前所支持的可用区内,且与集群处于同一VPC。
zoneMappings:
- vSwitchId: vsw-2zednnurkug2xl4******
- vSwitchId: vsw-2zeusdspvojoumx******
listeners:
- port: 443
protocol: HTTPS
caEnabled: true
caCertificates:
- CertificateId: 0e40dda998174723af39d37fcaf*****
certificates:
- CertificateId: 108*****-cn-hangzhou
IsDefault: true
步骤四:测试双向认证
拷贝以下内容到coffee.yaml文件,用于通过Ingress部署一个测试服务,并挂载到步骤三创建的监听上。
apiVersion: apps/v1 kind: Deployment metadata: name: coffee spec: replicas: 2 selector: matchLabels: app: coffee template: metadata: labels: app: coffee spec: containers: - name: coffee image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: coffee-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: coffee type: NodePort --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/listen-ports: | [{"HTTPS": 443}] name: alb-ingress spec: ingressClassName: alb rules: - host: alb.ingress.alibaba.com # 该host需要做域名解析。 http: paths: - path: / pathType: Prefix backend: service: name: coffee-svc port: number: 80
执行以下命令,部署测试服务。
kubectl apply -f coffee.yaml
预期输出:
deployment.apps/coffee created service/coffee-svc created ingress.networking.k8s.io/alb-ingress created
通过步骤二生成的客户端证书去访问服务。
登录应用型负载均衡ALB控制台,在顶部菜单栏处,选择已创建的ALB实例所在的地域。
在实例页面,单击目标实例。
在实例详情页面的可用区区域,获取ALB交换机的弹性公网IP,以备后续使用。
将弹性公网IP和需要访问的域名进行Host绑定,在Hosts文件中添加绑定信息。
123.XX.XX.XX alb.ingress.alibaba.com
Host绑定完成后,可以通过域名直接访问服务。
# 需将alb.ingress.alibaba.com替换为您自己的域名,且client.crt和client.key需要提供完整的文件路径。 curl https://alb.ingress.alibaba.com/ --cert client.crt --key client.key
执行该命令后,您会看到服务器的响应数据(一个HTML页面)。
相关文档
关于更多使用ALB部署HTTPS双向认证功能,请参见使用HTTPS双向认证提高服务的安全性。
如果在使用ALB过程中遇到相关报错或问题,请优先查阅文档解决。详细信息,请参见ALB Ingress异常问题排查、ALB Ingress FAQ。