使用HTTPS双向认证提高服务的安全性

HTTPS双向认证机制保证服务器端与客户端能互相验证对方的身份。在银行与金融服务、物联网、企业内部服务或政府服务等涉及大量隐私信息的场景中,您可以通过HTTPS双向认证机制保证信息安全。

HTTPS单向与双向认证的对比

  • 使用HTTPS单向认证:客户端从服务器端下载服务器端的SSL/TLS证书进行认证,然后建立安全通信通道。服务器端无法认证客户端的身份。

  • 使用HTTPS双向认证:客户端从服务器端下载服务器端的SSL/TLS证书进行认证,同时客户端还需要向服务器端提供自己的SSL/TLS证书进行认证。当双方都认证过对方的身份后,才能建立安全通信通道进行数据传输。通常情况下,服务器端持有根CA证书,而客户端的SSL/TLS证书基于此根CA证书签发,因此服务器端可以认证客户端的身份。使用HTTPS双向认证可以使服务只对受信任的客户端开放,可以有效防止中间人攻击,提升了服务的安全性。

前提条件

(可选)步骤一:生成自签根CA证书

如果您还未获取根CA证书,请参照以下步骤生成证书并上传至阿里云数字证书中心。

  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页面)。

相关文档