ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

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

2026/9/17 11:14:23 拓冰建站 浏览量
Velero 对接自签名证书对象存储:--cacert 信任链与 TLS 跳过机制全解析 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 信任链自签名证书不在其中。处理思路有两条本文依次展开推荐把签发该证书的 CA bundle 交给 Velero安装期或客户端命令期让 TLS 校验走私有信任链仅测试/开发跳过对象存储的 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 上的证书字段caCert与caCertRef从 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文档与源码均建议改用caCertRefcaCertRef指向同一命名空间内一个 SecretSecretKeySelector包含 Secret 名与 key把证书与 BSL 资源解耦便于更新与权限管理Validate() 显式校验不能同时设置caCert和caCertRef两者都设置时返回错误cannot specify both caCert and caCertRef in objectStorage对应的单测见 backupstoragelocation_types_test.go。四、Velero 客户端访问自签名存储--cacert标志当你要用describe、download、logs类命令访问存放在自签名存储中的备份或恢复对象时同样需要客户端信任该证书。文档给出的用法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.goGetCACertFromBackup按备份的spec.storageLocation找到 BSL取出其 CA 证书GetCACertFromRestore先经restore.spec.backupName找到源备份再走与备份相同的路径GetCACertFromBSL读取 BSL 时的优先级为caCertRefSecret优先回退到内联caCertdeprecatedBSL 或备份不存在时返回空字符串而非致命错误与测试用例 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%2Flist-type2prefix: remote error: tls: alert(116)按文档解释TLS 1.3RFC 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 describevelero backup downloadvelero backup logsvelero restore describevelero restore log命令标志帮助文本同样强调风险见 describe.goIf true, the object stores 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设为true。config是 BSL spec 上的通用map[string]string见 backupstoragelocation_types.go由 provider 插件与 Velero 共同解释。服务端连接的实际行为客户端下载备份内容时该布尔值会直接进入 Go 的tls.Configdownloadrequest.go 中InsecureSkipVerify: insecureSkipTLSVerify代码注释标注了 gosec 豁免理由This parameter is useful for some scenarios。文件备份场景的透传Velero 的文件备份File System Backup通过 Restic 或 Kopia 在对象存储与集群磁盘之间搬运数据。当你在上述涉及文件备份的 Velero 操作指定--insecure-skip-tls-verify时Velero 会把这个语义透传给底层工具例如对 ResticVelero 会给 Restic 命令追加全局参数--insecure-tls。这一点保证了CLI 上的开关与实际执行数据搬运的工具行为一致避免 Velero 自身跳过了校验、而 Restic/Kopia 仍然校验失败的不一致状态。七、选型建议小结场景推荐做法依据生产环境、自签名 S3velero install --cacert或 BSL 的caCertRefSecret第二、三章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),仅供参考