### 背景

升级 apisix 到 3.1.0 之后，遇到（failed to find any SSL certificate by SNI: cmdb.pingcap.net ） 问题。导致网站无法正常访问。
![img.png](img.png)

通过 [官方 issue](https://github.com/apache/apisix/issues/8173) 可知是个 bug，所以只能先通过 apisix-admin V3 API 创建 SSL 证书临时解决。

![img_1.png](img_1.png)

本文档主要记录下来解决过程，方便以后查阅。同时，在官方修复之前，暂停使用 dashboard ssl 功能。

### 配置

APISIX 支持通过 TLS 扩展 SNI 实现加载特定的 SSL 证书以实现对 https 的支持。 SNI（Server Name Indication）是用来改善 SSL 和 TLS
的一项特性，它允许客户端在服务器端向其发送证书之前向服务器端发送请求的域名，服务器端根据客户端请求的域名选择合适的 SSL 证书发送给客户端。

通常情况下一个 SSL 证书只包含一个静态域名，配置一个 ssl 参数对象，它包括 cert、key 和 sni 三个属性，详细如下：

1. cert：SSL 密钥对的公钥，pem 格式
2. key：SSL 密钥对的私钥，pem 格式
3. snis：SSL 证书所指定的一个或多个域名，注意在设置这个参数之前，你需要确保这个证书对应的私钥是有效的。

请按照以下步骤操作：

1、生成 SNI 证书：

将公钥粘贴到 t.crt 文件中，私钥粘贴到 t.key 文件中。

2、解决与 apisix-admin 通信问题：

2.1 apisix 部署在 k8s 中，没有暴露到公网，只有集群内可访问。建议将脚本、证书文件放到 apisix 容器中执行。

2.2 或者通过 forward 端口的方式，将 apisix-admin 转发到本地。

```shell
# apisix-admin forward 到本地

kubectl port-forward service/apisix-admin 9180:9180 -n apisix

# 增加执行权限
cd /apisix-on-k8s/certificate

chomod +x ssl.py

# 创建 SSL 对象
./ssl.py t.crt t.key pingcap.net

```

参考文档：
[Apisix](https://apisix.apache.org/zh/docs/apisix/certificate/)