# 为 Silo 启用多域 TLS

LLMS 索引： [llms.txt](/zh/llms.txt)

---

<a id="minio-tls"></a>

MinIO 支持使用 Transport Layer Security (TLS) 1.2+ 对入站和出站流量进行加密。

**Kubernetes**

MinIO Operator 支持通过以下方式为 MinIO 租户启用 TLS：

- 使用 Kubernetes Cluster Signing Certificates 自动下发 TLS
- 使用 Kubernetes secret 指定用户自有 TLS
- 使用 cert-manager 管理 TLS 证书

MinIO Operator 支持在 [部署](/zh/operations/deployments/k8s-deploy-minio-tenant-on-kubernetes/#minio-k8s-deploy-minio-tenant-security) 或 [修改](/zh/operations/deployments/k8s-modify-minio-tenant-on-kubernetes/#minio-k8s-modify-minio-tenant-security) MinIO 租户时挂载用户指定的 TLS 证书。

这些自定义证书支持 [Server Name Indication (SNI)](https://en.wikipedia.org/wiki/Server_Name_Indication)，即 MinIO server 会根据客户端指定的主机名决定使用哪张证书。 例如，你可以生成由组织内首选 Certificate Authority (CA) 签发的证书，并将其挂载到 MinIO 租户上。 信任该 <abbr title="Certificate Authority">CA</abbr> 的应用可以连接到 MinIO 租户，并完整校验其 TLS 证书。

**裸金属**

MinIO 会自动检测配置目录或默认目录中的 TLS 证书，并在启用 TLS 的情况下启动。

MinIO server 支持多张 TLS 证书，server 会使用 [Server Name Indication (SNI)](https://en.wikipedia.org/wiki/Server_Name_Indication) 来识别在响应客户端请求时应当使用哪张证书。 当客户端使用特定主机名连接时，MinIO 会通过 <abbr title="Server Name Indication">SNI</abbr> 选择与该主机名匹配的 TLS 证书。

本文说明如何为 MinIO 启用多域 TLS。部署只服务一个主机名时，请参阅[单域 TLS 指南](/zh/operations/network-encryption/enable-minio-tls/)。

## 前提条件 {#id2}

### 访问 MinIO 集群 {#minio}

**Kubernetes**

你必须能够访问 Kubernetes 集群，并且 `kubectl` 配置中具备对应的管理权限。

本过程假设你的权限足以在 Kubernetes 集群中部署或修改 MinIO 相关资源，包括但不限于 pod、statefulset、replicaset、deployment 和 secret。

**裸金属**

本过程使用 [`mc`](/zh/reference/minio-mc/#command-mc) 对 MinIO 集群执行操作。 请在一台可通过网络访问该集群的机器上安装 `mc`。 关于下载和安装 `mc`，请参见 `mc` [Installation Quickstart](/zh/reference/minio-mc/#mc-install)。

本过程还假设你已经为 MinIO 集群配置了 [`alias`](/zh/reference/minio-mc/mc-alias/#command-mc.alias)。

同时假设你拥有对每台 MinIO 主机 server 的 SSH 或类似 shell 级别的管理访问权限。

### TLS 证书 {#tls}

请准备 MinIO 所需的 TLS 证书，并确保其使用 [受支持的密码套件](/zh/operations/network-encryption/#minio-tls-supported-cipher-suites)。

**Kubernetes**

关于支持的租户 TLS 配置，请参见 [Kubernetes 上的 MinIO TLS](/zh/operations/network-encryption/#minio-tls-kubernetes)。

**裸金属**

请按你偏好的方式准备证书，例如通过组织内部 Certificate Authority，或使用 Digicert、Verisign 等知名公共提供商。

你也可以使用 `openssl` 或 MinIO 的 [certgen](https://github.com/minio/certgen) 工具创建自签名证书。

例如，以下命令会生成一个自签名证书，其中包含与 MinIO 服务端 主机关联的一组 IP 和 DNS Subject Alternative Name (SAN)：

```shell
certgen -host "localhost,minio-*.example.net"
```

关于证书生成和放置方式的更完整说明，请参见 [裸金属上的 MinIO TLS](/zh/operations/network-encryption/#minio-tls-baremetal)。

## 步骤 {#id3}

**Kubernetes**

MinIO Operator 支持通过三种方式管理 MinIO 租户上的 TLS 证书：

- MinIO 自动生成 TLS 证书
- 用户指定的 TLS 证书
- 由 `cert-manager` 管理的 TLS 证书

你也可以部署未启用 TLS 的 MinIO 租户。

**MinIO Auto\-TLS**

以下步骤同时适用于使用 `Kustomize` 的新建和现有 MinIO 部署：

1. 检查 [Tenant CRD](/zh/reference/operator-crd/#minio-operator-crd) 中的 `TenantSpec.requestAutoCert` 和 `TenantSpec.certConfig` 字段。

   对于现有 MinIO 租户，请检查用于创建租户的 Kustomize 资源，并查看这些字段及其当前配置（如果已配置）。
2. 按需创建或修改租户 YAML，设置 `requestAutoCert` 和 `certConfig` 的值。 例如：

   ```yaml
   spec:
      requestAutoCert: true
      certConfig:
        commonName: "CN=MinioTenantCommonName"
        organizationName: "O=MyOrganizationName"
        dnsNames:
          - 'minio-tenant.domain.tld'
          - '*.kubernete.cluster.dns.path.tld'
   ```

   `spec.certConfig.dnsNames` 应包含 TLS 证书所覆盖的 <abbr title="Subject Alternate Names">SAN</abbr> 列表。

   创建或修改租户资源时，可参考 [固定到 `v7.1.1` 的 Kustomize Tenant base YAML](https://github.com/minio/operator/blob/v7.1.1/examples/kustomization/base/tenant.yaml) 作为基线模板。
3. 应用新的 Kustomization 模板

   一旦应用这些更改，MinIO Operator 会使用更新后的配置自动重新部署该租户。

**CertManager**

以下步骤同时适用于使用 `Kustomize` 的新建和现有 MinIO 部署：

1. 检查 [Tenant CRD](/zh/reference/operator-crd/#minio-operator-crd) 中的 `TenantSpec.externalCertsCecret` 字段

   对于现有 MinIO 租户，请检查用于创建租户的 Kustomize 资源，并查看该字段当前配置（如果已配置）。
2. 创建或修改租户 YAML，使其引用适当的 `cert-manager` 资源。

   例如，以下租户 YAML 片段引用了一个名为 `myminio-tls` 的 cert-manager 资源：

   ```yaml
   apiVersion: minio.min.io/v2
   kind: Tenant
   metadata:
   name: myminio
   namespace: minio-tenant
   spec:
      ## Disable default tls certificates.
      requestAutoCert: false
      ## Use certificates generated by cert-manager.
      externalCertSecret:
         - name: default-domain
           type: cert-manager.io/v1
         - name: internal-domain
           type: cert-manager.io/v1
         - name: external-domain
           type: cert-manager.io/v1
   ```

3. 应用新的 Kustomization 模板

   一旦应用这些更改，MinIO Operator 会使用更新后的配置自动重新部署该租户。

**用户指定**

以下步骤同时适用于使用 `Kustomize` 的新建和现有 MinIO 部署：

1. 检查 [Tenant CRD](/zh/reference/operator-crd/#minio-operator-crd) 中的 `TenantSpec.externalCertSecret` 字段。

   对于现有 MinIO 租户，请检查用于创建租户的 Kustomize 资源，并查看该字段当前配置（如果已配置）。
2. 创建或修改租户 YAML，使其引用一个类型为 `kubernetes.io/tls` 的 secret：

   例如，以下租户 YAML 片段为 MinIO 租户可接受连接的每个域名引用了两份 TLS secret：

   ```yaml
   apiVersion: minio.min.io/v2
   kind: Tenant
   metadata:
   name: myminio
   namespace: minio-tenant
   spec:
      ## Disable default tls certificates.
      requestAutoCert: false
      ## Use certificates generated by cert-manager.
      externalCertSecret:
      - name: domain-certificate-1
      type: kubernetes.io/tls
      - name: domain-certificate-2
      type: kubernetes.io/tls
   ```

3. 应用新的 Kustomization 模板

   一旦应用这些更改，MinIO Operator 会使用更新后的配置自动重新部署该租户。

**裸金属**

MinIO Server 会为每个节点搜索 TLS 私钥和证书，并使用这些凭据启用 TLS。 MinIO 会在发现并验证证书后自动启用 TLS。 搜索位置取决于你的 MinIO 配置：

**Default Path**

默认情况下，MinIO server 会在以下目录中查找每个节点的 TLS 私钥和证书：

```shell
${HOME}/.minio/certs
```

其中 `${HOME}` 是运行 MinIO 服务端进程的用户主目录。 如果 `${HOME}/.minio/certs` 目录不存在，你可能需要手动创建它。

对于由 `systemd` 管理的部署，该路径必须对应运行 MinIO 进程的 `USER`。 如果该用户没有主目录，请改用 **Custom Path** 选项。

**Custom Path**

你可以通过 [`minio server --certs-dir`](/zh/reference/minio-server/#minio.server.-certs-dir) 或 `-S` 参数指定 MinIO server 搜索证书的路径。

例如，以下命令片段指示 MinIO 进程使用 `/opt/minio/certs` 目录存放 TLS 证书。

```shell
minio server --certs-dir /opt/minio/certs ...
```

运行 MinIO service 的用户 *必须* 对该目录拥有读写权限。

请将证书放入 `/certs` 目录，并为 MinIO 需要呈现 TLS 证书的每个附加域名在 `/certs` 下创建一个子目录。 虽然 MinIO 对目录名称没有强制要求，但建议将子目录命名为对应域名，以便人工识别。 请将该域名的 TLS 私钥和公钥证书放入对应子目录中。

```shell
/path/to/certs
   private.key
   public.crt
   s3-example.net/
      private.key
      public.crt
   internal-example.net/
      private.key
      public.crt
```
