IBM Cloud Docs
使用相互 TLS

使用相互 TLS

相互传输层安全性 (mTLS) 认证可确保客户机与服务器之间的流量在两个方向上都是安全和可信的。 它只适用于任何企业计划级别的客户。

配置 mTLS 时,仅向具有相应客户机证书的请求授予访问权。 当您的应用程序收到请求时,CIS 会响应请求,提供客户证书。 如果客户机未能提供证书,那么不允许请求继续。 否则,将继续进行密钥交换。

mTLS示意图*
mTLS示意图

配置 Mutual TLS

相互 TLS ( mTLS ) 提供基于证书的客户端身份验证,以增强安全性。默认情况下不启用 mTLS,需要根据每个域事先获得授权。 要配置 mTLS,,请按以下步骤操作:

  1. 请求授权。 创建支持案例,请求 mTLS 启用您的 IBM Cloud 账户。

    启用 mTLS 后,无法将其禁用。

  2. 启用 mTLS:

    1. 在 CIS 控制台中,单击安全性,然后选择相互 TLS 选项卡。
    2. 单击启用
  3. 上传根证书

    1. Mutual TLS 页面的根证书表中,单击添加定义新的根证书。

    2. 将证书内容粘贴到证书内容字段。 提供根 CA 证书的名称,并添加一个或多个将使用该证书的端点的完全合格域名 (FQDN)。

      这些 FQDN 是受 mTLS 应用策略保护的资源所使用的主机名。 您必须将根 CA 与受保护应用程序使用的 FQDN 相关联。

    3. 单击保存

      如果使用中间证书,请上传整个证书链。

  4. 创建 mTLS 访问策略:

    1. “Mutual TLS” 页面的 “MTLS 访问策略” 表中,单击 “创建” 以创建访问应用。

    2. 选择或输入与上传的根证书相关联的 FQDN 之一相匹配的主机名,然后单击创建

      应用程序策略预设为使用 non_identity 的决定,并包括一条匹配任何有效客户证书的规则。

  5. 使用 API 启用客户端证书转发:

    要将已验证的客户端证书转发到原服务器(用于日志记录、审计或后端身份验证),必须启用转发功能。

    客户证书只与每个 mTLS 连接中的第一个请求一起转发。

    有关启用客户端证书转发的 API curl 示例,请参阅 更新访问证书设置 API。

    发送到源服务器的客户端证书标头:

    • Cf-Client-Cert-Der-Base64: Base64-encoded 客户证书的 DER 版本
    • Cf-Client-Cert-Sha256:SHA-256 客户证书指纹

    使用 API 验证转发状态:

    curl -X GET https://api.cis.cloud.ibm.com/v1/crn:v1:bluemix:public:internet-svcs:global:a/<account-id>:<instance-id>::/zones/<zone-id>/access/certificates/settings \
     -H 'X-Auth-User-Token: Bearer <IAM-TOKEN>'
    
  6. 创建 WAF 自定义规则,阻止未经身份验证的请求:

    为提高安全性,尤其是敏感端点(如登录路径或 API)的安全性,可创建 WAF 规则来阻止未提交有效客户端证书的请求。

    1. 在 CIS 控制台中,返回“安全”部分,然后选择“自定义规则”选项卡。

    2. 单击创建

    3. 在创建 WAF 自定义规则侧面板中,单击使用表达式编辑器

    4. 使用表达式生成器字段中输入以下条件(根据需要更新 hostnamepath )。

      (http.host eq "example.com" and http.request.uri.path eq "/authenticate" and not cf.tls_client_auth.cert_verified)
      
    5. 操作设置为阻止

    6. 单击创建

    只有在成功验证客户证书后,该规则才允许访问验证。 没有 mTLS 或证书无效的请求将被阻止。

测试 mTLS 访问

下面的示例使用 curl 测试 mTLS 身份验证,分别使用客户端证书和不使用客户端证书发出请求。

  1. 尝试在没有客户证书的情况下访问网站。

    本例演示了如何使用 curl 测试对一个执行 mTLS 的网站的访问。 本例中的目标 URL 是 https://auth.example.com

    curl -sv https://auth.example.com
    

    由于没有提供客户证书,预计该请求将以 403 Forbidden 响应失败。

  2. 在请求中添加客户证书和私钥:

    curl -sv https://auth.example.com --cert example.pem --key key.pem
    

    如果客户端通过了正确的身份验证,响应会包含一个 CF_Authorization Set-Cookie 标头,表明 mTLS 身份验证成功。

验证相互 TLS

启用此访问策略后,请使用以下工作流程验证客户端证书:

将评估对源的所有请求以获取有效的客户机证书。

  1. 客户端通过发送 Hello 消息启动连接。
  2. 访问应用程序会以 Hello 作为回应,并请求客户证书。
  3. 客户发送证书以供验证。
  4. 客户端证书根据配置的根证书颁发机构进行验证。
  5. 如果使用证书链,系统还会检查过期证书并验证整个证书链。
  6. 如果客户端证书是可信的,就会为客户端生成一个已签名的 JSON 网络令牌 (JWT),该令牌允许请求和后续请求继续进行。
  7. 如果客户端没有提供有效证书,服务器将返回 403 Forbidden 响应。

要使用 API 检索访问证书,请参阅 列出访问 证书。