文档

通过ALB Ingress部署HTTPS双向认证

更新时间:

为确保关键业务的数据传输安全,推荐您通过配置ALB Ingress来实施HTTPS双向认证。这种认证机制不仅确保了服务端的安全,还要求客户端证明其身份,从而对流量进行双向验证。通过这种方式建立的加密通信通道可以显著增强业务操作的保密性。

HTTPS单向、双向认证介绍

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

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

为确保关键业务流程的数据传输安全,推荐您通过配置ALB Ingress来实施HTTPS双向认证。

前提条件

步骤一:购买服务器证书

您可以选择从阿里云或其他服务商购买服务器证书,并且可以通过浏览器检查服务器发送的证书是否是由自己所信任的中心签发的。

本文以在阿里云数字证书管理服务控制台购买或上传服务器证书为例。具体操作,请参见购买SSL证书上传SSL证书

说明

在确保服务器证书可以被客户端(如Web浏览器)信任的情况下,可以由同一个CA(证书颁发机构)签发给多个客户端,也可以由多个不同的CA签发给不同的客户端。

步骤二:准备自签CA证书

您可以通过证书中心购买CA证书并申请客户端证书,也可以上传自签的CA证书至证书中心。

ALB支持自签根CA或自签子根CA证书进行双向认证,本文以自签根CA证书为例,为您介绍如何上传自签CA证书至证书中心并在Albconfig中使用。

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

    openssl genrsa -out ca.key 4096
  2. 执行以下命令,创建根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

    (选填)可选的公司名称。本示例未设置。

  3. 执行以下命令,创建根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证书。

    重要

    私钥属于敏感信息,请不要轻易泄露。

  4. 登录数字证书管理服务控制台,在左侧导航栏,单击证书应用仓库

  5. 证书应用仓库页面,单击创建仓库,在创建仓库面板,配置以下参数,然后单击确定

    配置项

    说明

    仓库名称

    自定义仓库名称。

    据来源

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

  6. 证书应用仓库页面,单击上一步创建的目标证书仓库,然后在证书管理页面,单击上传证书

  7. CA信息面板,参考下表配置,上传步骤3创建的CA证书,然后单击确认并启用

    配置项

    说明

    名称

    为要上传的私有证书自定义名称。

    证书文件

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

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

    证书私钥

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

步骤三:准备客户端证书

客户端证书您可以在控制台购买,也可以通过自签的CA来签发客户端证书。

本文介绍如何通过步骤二的自签CA证书签发客户端证书,并在创建监听后,使用自签客户端证书和服务器完成双向认证。

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

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

    openssl req -new -out client.csr -key client.key
  3. 执行以下命令,生成客户端证书。

    openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650

    CA和CAkey指向步骤二创建的根证书。

  4. 完成上述操作后,执行ls命令,即可在当前目录中看到生成的客户端证书。

    client.crt client.csr client.key

步骤四:使用Albconfig创建双向认证监听

  1. 步骤一中创建的服务器证书Certificates,填写到Albconfig的Certificates字段,作为服务器的默认证书。

    1. 登录数字证书管理服务控制台,在左侧导航栏,单击SSL证书

    2. SSL证书页面,在目标证书的操作栏单击image.png,然后选择详情

    3. 证书详情面板,即可查看证书的Certificates。

  2. 步骤二中创建的根证书Identifier,填写到Albconfig的CaCertificates对应的CertificateId处。

    1. 登录数字证书管理服务控制台,在左侧导航栏,单击证书应用仓库

    2. 证书应用仓库页面,单击目标证书仓库,然后在证书管理页面,单击详情

    3. 证书详情面板,即可查看证书的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

步骤五:测试双向认证

  1. 拷贝以下内容到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
  2. 执行以下命令,部署测试服务。

    kubectl apply -f coffee.yaml

    预期输出:

    deployment.apps/coffee created
    service/coffee-svc created
    ingress.networking.k8s.io/alb-ingress created
  3. 通过步骤三生成的客户端证书去访问服务。

    1. 登录应用型负载均衡ALB控制台,在顶部菜单栏处,选择已创建的ALB实例所在的地域。

    2. 实例页面,单击目标实例。

    3. 实例详情页面的可用区区域,获取ALB交换机的弹性公网IP,以备后续使用。

    4. 将弹性公网IP和需要访问的域名进行Host绑定,在Hosts文件中添加绑定信息。

      123.XX.XX.XX alb.ingress.alibaba.com
    5. Host绑定完成后,可以通过域名直接访问服务。

       # 需将alb.ingress.alibaba.com替换为您自己的域名,且client.crt和client.key需要提供完整的文件路径。
      curl https://alb.ingress.alibaba.com/ --cert client.crt --key client.key

      执行该命令后,您会看到服务器的响应数据(一个HTML页面)。

相关文档

  • 本页导读 (1)
文档反馈