Velero 对接自签名证书对象存储:--cacert 信任链与 TLS 跳过机制全解析
2026/9/17 11:14:18 网站建设 项目流程

Velero 对接自签名证书对象存储:--cacert 信任链与 TLS 跳过机制全解析

【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero

当你使用以自签名证书提供 TLS 保护的 S3 兼容对象存储时,Velero 在备份、恢复或访问备份内容时会因无法验证证书链而连接失败。本文以 Velero 官方文档《Use Velero with a storage provider secured by a self-signed certificate》为主体,完整讲解安装期--cacert信任配置、客户端命令的证书解析链路、自定义 S3 服务器的 TLS 116 告警成因,以及--insecure-skip-tls-verify的适用边界,并结合当前仓库源码说明每个配置项的落点与底层实现,帮助你在自签名环境中正确、安全地打通对象存储 TLS。

一、问题背景:certificate signed by unknown authority

典型的故障现象是:对象存储(S3 兼容服务商或自建 MinIO 等)使用自签名证书或私有 CA 签发的证书时,Velero 与对象存储之间的 TLS 握手在客户端校验阶段失败,报错包含certificate signed by unknown authority

原因很直接:Velero 默认只信任系统 CA 信任链,自签名证书不在其中。处理思路有两条,本文依次展开:

  1. 推荐:把签发该证书的 CA bundle 交给 Velero(安装期或客户端命令期),让 TLS 校验走私有信任链;
  2. 仅测试/开发:跳过对象存储的 TLS 证书校验(存在中间人攻击风险,文档明确不推荐用于生产)。

二、安装时信任自签名证书:velero install --cacert

velero install命令中,通过--cacert标志提供 PEM 编码证书 bundle 的路径:

velero install \ --plugins <PLUGIN_CONTAINER_IMAGE [PLUGIN_CONTAINER_IMAGE]> \ --provider <YOUR_PROVIDER> \ --bucket <YOUR_BUCKET> \ --secret-file <PATH_TO_FILE> \ --cacert <PATH_TO_CA_BUNDLE>

配置后,Velero 在后续备份与恢复过程中自动使用该 CA bundle 验证与存储提供商之间的 TLS 连接。

源码中的参数落点

  • 标志定义在 install 命令:--cacert帮助文本为 "File containing a certificate bundle to use when verifying TLS connections to the object store. Optional.";
  • AsVeleroOptions()会读取该文件内容(见 install.go);
  • 读取到的证书数据最终写入 BackupStorageLocation 的spec.objectStorage.caCert字段,见 resources.go 中CACert: caCert的赋值。

也就是说,安装期的--cacert并不是让 CLI 临时记住一份文件,而是把 CA bundle持久化进了 BSL 资源,集群内控制器、备份/恢复 Pod 之后都从 BSL 上取用。

三、BSL 上的证书字段:caCertcaCertRef

从 backupstoragelocation_types.go 可以看到ObjectStorageLocation定义了两个互斥字段:

// CACert defines a CA bundle to use when verifying TLS connections to the provider. // Deprecated: Use CACertRef instead. // +optional CACert []byte `json:"caCert,omitempty"` // CACertRef is a reference to a Secret containing the CA certificate bundle to use // when verifying TLS connections to the provider. The Secret must be in the same // namespace as the BackupStorageLocation. // +optional CACertRef *corev1api.SecretKeySelector `json:"caCertRef,omitempty"`

要点:

  • caCert是内联证书字段,已被标记 Deprecated,文档与源码均建议改用caCertRef
  • caCertRef指向同一命名空间内一个 Secret(SecretKeySelector包含 Secret 名与 key),把证书与 BSL 资源解耦,便于更新与权限管理;
  • Validate() 显式校验"不能同时设置caCertcaCertRef",两者都设置时返回错误cannot specify both caCert and caCertRef in objectStorage,对应的单测见 backupstoragelocation_types_test.go。

四、Velero 客户端访问自签名存储:--cacert标志

当你要用describedownloadlogs类命令访问存放在自签名存储中的备份或恢复对象时,同样需要客户端信任该证书。文档给出的用法:

velero backup describe my-backup --cacert <PATH_TO_CA_BUNDLE>

标志语义与 BSL 自动回退

从 backup/describe.go 的帮助文本可以确认语义细节:

Path to a certificate bundle to use when verifying TLS connections.If not specified, the CA certificate from the BackupStorageLocation will be used if available.

即:命令行--cacert是可选覆盖项。若不指定,客户端会自动去取 BSL 上配置的 CA 证书(通常就是第二章中安装期写入的那份)。客户端侧的证书提取逻辑集中在 bsl_cacert.go:

  • GetCACertFromBackup:按备份的spec.storageLocation找到 BSL,取出其 CA 证书;
  • GetCACertFromRestore:先经restore.spec.backupName找到源备份,再走与备份相同的路径;
  • GetCACertFromBSL:读取 BSL 时的优先级为caCertRef(Secret)优先,回退到内联caCert(deprecated);BSL 或备份不存在时返回空字符串而非致命错误,与测试用例 bsl_cacert_test.go 的断言一致。

velero backup download的完整链路可见 download.go:先调用cacert.GetCACertFromBackup取得 BSL 证书,再交给downloadrequest.StreamWithBSLCACert建流下载。客户端全局配置还支持通过环境变量/配置文件提供cacert键(config.go 中ConfigKeyCACert = "cacert"),免去每次输入路径。

五、自定义 S3 兼容服务器的 TLS 告警 116:服务端要求客户端证书

若你使用的是自建 S3 兼容服务器,备份可能失败并报出类似错误:

rpc error: code = Unknown desc = RequestError: send request failed caused by: Get https://minio.com:3000/k8s-backup-bucket?delimiter=%2F&list-type=2&prefix=: remote error: tls: alert(116)

按文档解释:

  • TLS 1.3(RFC 8446)附录 B.2 中告警码 116 表示certificate required——服务端要求客户端出示证书;
  • Velero 作为客户端在 TLS 握手中不会携带客户端证书
  • 而 TLS 1.3 规范中,服务端校验客户端证书本是可选行为,因此正确做法是修改 S3 服务器端的配置,取消强制双向认证(mutual TLS),而不是在 Velero 侧"修复"。

这条排查路径值得单独成节:116 号告警与第一章的unknown authority成因完全不同——前者是服务端策略问题,后者才是客户端信任链问题,混淆二者会走弯路。

六、跳过 TLS 校验:--insecure-skip-tls-verify的适用边界

文档对此有明确的安全警告:--insecure-skip-tls-verify标志不安全、易受中间人攻击,仅面向本地/私有环境的测试与开发场景,不推荐在生产使用

支持的命令清单

Velero 在以下命令上提供--insecure-skip-tls-verify(文档范围限定于 AWS provider 插件或文件备份 File System Backup 场景下访问对象存储):

  • velero backup describe
  • velero backup download
  • velero backup logs
  • velero restore describe
  • velero restore log

命令标志帮助文本同样强调风险,见 describe.go:"If true, the object store's TLS certificate will not be checked for validity. This is insecure and susceptible to man-in-the-middle attacks. Not recommended for production."

永久生效:BSL 的Spec.Config.InsecureSkipTLSVerify

若希望某对象存储永久跳过 TLS 校验,可在 BackupStorageLocation CRD 中把spec.config.InsecureSkipTLSVerify设为trueconfig是 BSL spec 上的通用map[string]string(见 backupstoragelocation_types.go),由 provider 插件与 Velero 共同解释。

服务端连接的实际行为

客户端下载备份内容时,该布尔值会直接进入 Go 的tls.Config:downloadrequest.go 中InsecureSkipVerify: insecureSkipTLSVerify(代码注释标注了 gosec 豁免理由:"This parameter is useful for some scenarios")。

文件备份场景的透传

Velero 的文件备份(File System Backup)通过 Restic 或 Kopia 在对象存储与集群磁盘之间搬运数据。当你在上述涉及文件备份的 Velero 操作指定--insecure-skip-tls-verify时,Velero 会把这个语义透传给底层工具:例如对 Restic,Velero 会给 Restic 命令追加全局参数--insecure-tls。这一点保证了"CLI 上的开关"与"实际执行数据搬运的工具"行为一致,避免 Velero 自身跳过了校验、而 Restic/Kopia 仍然校验失败的不一致状态。

七、选型建议小结

场景推荐做法依据
生产环境、自签名 S3velero install --cacert或 BSL 的caCertRef(Secret)第二、三章;caCert已废弃,优先caCertRef
客户端 describe/download/logs 访问不传--cacert时自动复用 BSL 证书;跨环境可用时显式传--cacertbsl_cacert.go
自建 S3 报tls: alert(116)修改服务端取消强制客户端证书第五章
本地测试/开发--insecure-skip-tls-verify或 BSLconfig.InsecureSkipTLSVerify: true第六章;明确不用于生产

整体原则与文档一致:能用信任链就不用跳过校验;跳过 TLS 是面向测试场景的临时逃生门,其风险(中间人攻击)在备份这种"最后防线"型数据链路上尤其不可忽视。

【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询