Bazel 9.0.0对接Buildbarn mTLS远程缓存CI证书验证失败
在GitLab CI中使用Bazel 9.0.0对接mTLS认证的Buildbarn远程缓存问题
环境与背景
在GitLab CI环境中,尝试使用Bazel 9.0.0将Buildbarn作为远程缓存,该缓存端点通过**客户端证书认证的TLS(mTLS)**暴露:
- ASSET_SERVER地址:
ra.xxx-xxx-cache.com - CAS_SERVER地址:
re.xxx-xxx-cache.com
现有CI配置
已通过环境变量导出证书文件:
echo "$CACHE_CLIENT_CERT" > client.pem echo "$CACHE_CLIENT_KEY" > client.key echo "$CACHE_SERVER_CA" > ca.pem chmod 600 client.key
执行的构建命令:
bazel build //:my_elf \ --remote_cache=https://re.xxx-xxx-cache.com \ --remote_upload_local_results=true
切换为grpcs://或grpc://协议后,仍出现证书验证错误。
核心问题
- 对于启用TLS的Buildbarn缓存,Bazel应使用哪种URL scheme?
https://...grpc://...grpcs://...
- 如何正确传递自定义CA、客户端证书及客户端密钥?
- Bazel 9.0.0是否完全支持
--remote_cache的mTLS功能?
同时需要明确:Bazel remote_cache使用mTLS的正确最小配置是什么?
问题解答
1. 正确的URL Scheme选择
Buildbarn作为远程缓存时,Bazel需要使用**grpcs://**作为URL scheme:
grpc://:用于无TLS的明文gRPC通信,不适合mTLS场景https://:用于HTTP/REST协议的远程缓存,但Buildbarn默认使用gRPC协议提供缓存服务,因此不适用grpcs://:用于启用TLS的gRPC通信,是mTLS场景下的正确选择
2. 传递mTLS证书的正确参数
Bazel提供了专门的命令行参数来配置mTLS相关证书,需要在构建命令中添加以下参数:
--remote_ca_certs=./ca.pem:指定用于验证服务端证书的自定义CA证书文件路径--remote_client_cert=./client.pem:指定客户端证书文件路径--remote_client_key=./client.key:指定客户端私钥文件路径
注意:私钥文件必须设置严格的权限(如chmod 600),否则Bazel会拒绝加载。
3. Bazel 9.0.0对mTLS的支持情况
Bazel 9.0.0完全支持--remote_cache的mTLS功能,该功能在更早的版本(如Bazel 5.x+)就已经稳定支持,9.0.0版本不存在功能缺失问题,证书验证错误大概率是参数配置不全或scheme选择错误导致。
正确的最小配置示例
结合上述要点,在GitLab CI中的完整构建命令应为:
# 导出证书文件 echo "$CACHE_CLIENT_CERT" > client.pem echo "$CACHE_CLIENT_KEY" > client.key echo "$CACHE_SERVER_CA" > ca.pem chmod 600 client.key # 执行Bazel构建 bazel build //:my_elf \ --remote_cache=grpcs://re.xxx-xxx-cache.com \ --remote_upload_local_results=true \ --remote_ca_certs=./ca.pem \ --remote_client_cert=./client.pem \ --remote_client_key=./client.key
如果需要同时配置Asset Server(用于远程文件获取),可以添加--remote_downloader=grpcs://ra.xxx-xxx-cache.com参数,并复用相同的TLS证书参数。
内容的提问来源于stack exchange,提问作者ap00rva
相关产品推荐
相关产品推荐

