# [KB] TiCDC 启用 TLS 后 tiup display 显示状态为 down

## Key Words

ticdc, tls

## Description

1. 目前 TiCDC v5.3.0 在用户开启集群间 tls 访问时，可能会出现 cli 和 http api 不可用的问题。
2. 如果用户使用 tiup cluster 部署 tls 集群，由于 http api 不可用，会导致 cdc 进程实际上已经成功运行，但是通过 tiup cluster display \[cluster-name] 的方式查看时，依然处于 down 的状态。

## Root Cause

当用户配置了 tls，TiCDC 在启动时会主动在 http server 的 tls 配置中启用 [common name 功能](https://docs.pingcap.com/zh/tidb/stable/enable-tls-between-components#%E8%AE%A4%E8%AF%81%E7%BB%84%E4%BB%B6%E8%B0%83%E7%94%A8%E8%80%85%E8%BA%AB%E4%BB%BD)，并且把 common name 设置为启动 TiCDC server 所使用的证书的 common name。这样就会导致用户在使用 cli 或者 http api 访问 TiCDC server 的时候，如果所使用的证书的 common name 不存在 TiCDC server 的 common name 列表内，就会被拒绝访问。

## Diagnostic Steps

1. 对现有集群启用 TLS 后 tiup display 显示 TiCDC down, 监控看不到 changefeed 状态；
2. 查看 TiCDC 日志发现无异常，依然在工作能够继续推送数据；
3. disable tls 以后 tiup display 显示 TiCDC 正常；
4. enable tls 以后 对 TiCDC 节点做了缩容扩容操作问题依然存在；
5. changefeed query 可以显示状态， changefeed list/remove 命令失败提示证书错误；

## Resolution

升级到未受影响版本

## Workaround

使用 --cert-allowed-cn 参数解决 tiup 显示问题，使用 cdc 目录下的证书解决操作 changefeed 任务的问题 。具体：

### 方案一

在启动 TiCDC server 的时候，主动在命令行参数或者 config 中显式配置将会在 cli 或者 http api 上使用的证书的 common name。 **假如在 cli 上使用的证书的 common name 为 client** ，以下两种方式选一种进行配置即可：

* [命令行参数设置时加上 --cert-allowed-cn 选项](https://docs.pingcap.com/zh/tidb/stable/enable-tls-between-components#:~:text=Server%22%2C%20%22PD%2DControl%22%5D-,TiCDC,-%E5%9C%A8%E5%90%AF%E5%8A%A8%E5%91%BD%E4%BB%A4)：

    ```golang
    bin/cdc server \

        --ca tls/ca.crt \

        --cert tls/cdc.crt \

        --key tls/cdc.pem \

        --config conf/cdc.toml \

        --cert-allowed-cn "client"
    ```

* 在 cdc 启动 config 中加上 client 的 common name：

```yaml
[security]
   ca-path = "$TLS_DIR/ca.pem"
   cert-path = "$TLS_DIR/server.pem"
   key-path = "$TLS_DIR/server-key.pem"
   cert-allowed-cn = \["client"]
```

配置完成之后，即可使用该 client 证书来对 cdc server 进行访问。

如果使用 tiup cluster [enable-tls](https://docs.pingcap.com/zh/tidb/stable/tiup-cluster-topology-reference#:~:text=%E9%BB%98%E8%AE%A4%E5%80%BC%EF%BC%9A22-,enable_tls,-%EF%BC%9A%E6%98%AF%E5%90%A6%E5%AF%B9%E9%9B%86%E7%BE%A4) 参数来启用集群间 tls 访问，则需要在 TiCDC 部署目录下的 run_cdc.sh 中加上 tiup 访问该集群所使用的 client 证书的 common name。tiup 访问它部署集群的默认证书的 common name 为 \[cluster-name]-client ，假设通过 tiup cluster 部署了一个名为 tidb1 的集群，那么这个集群 client 证书的默认 common name 为  **tidb1-client** 。

### 方案二

用户可以用启动 TiCDC server 时所采用的证书来使用 cli 或访问 http api。

> **注意**
>
> 配置了 tls 之后，在使用 cli 或者访问 http api 时， **必须显式指定证书** ，格式如下所示：
>
> **Cli** ：./cdc cli changefeed list --pd "[https://127.0.0.1:2379](https://127.0.0.1:2379)" --ca="../tls/ca.crt" --cert="../tls/cdc.crt" --key="../tls/cdc.pem"
>
> **HTTP API：** curl --cacert ./ca.crt --cert ./cdc.crt  --key ./cdc.pem [https://127.0.0.1:8300/status](https://127.0.0.1:8300/status)

## Affected Versions

v5.2.4, v5.3.0