AKS 1.20.7下Elasticsearch 7.12.0挂载云PEM证书报RSA验证错误
根因
核心问题为CSI驱动从KeyVault拉取并挂载的PEM证书内容/格式被修改,不符合OpenSSL解析要求,从你提供的两个场景的openssl返回结果可以看出,CSI挂载的证书和内置证书的序列化内容存在明显差异,最终触发RSA签名校验失败,具体常见诱因如下:
- 未在SecretProviderClass配置中明确指定证书导出格式为PEM,CSI驱动默认导出二进制PFX格式的证书却以PEM后缀命名,OpenSSL无法正常解析二进制内容
- 导出的PEM证书携带Windows风格的CRLF换行符,而非OpenSSL要求的Unix风格LF换行符,解析时出现字节错位
- 挂载的PEM证书末尾缺少标准格式要求的结束换行符,导致最后一个字节读取异常
- 部分版本的KeyVault CSI驱动导出证书时会自动添加UTF-8 BOM头,也会导致OpenSSL解析失败
自定义镜像中内置的证书是提前处理好的标准PEM格式,编码、换行符、内容完全符合解析要求,因此集群可以正常运行。
解决方案
1. 修正CSI证书导出配置
在SecretProviderClass资源中明确指定证书的导出格式和编码,避免默认配置导致的格式异常,参考配置:
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: es-kv-cert spec: provider: azure parameters: keyvaultName: <你的KeyVault名称> usePodIdentity: "false" tenantId: <你的租户ID> objects: | array: - | objectName: <证书在KeyVault中的名称> objectType: certificate objectFormat: pem objectEncoding: utf8 secretObjects: - secretName: es-tls-cert type: Opaque data: - key: tls.crt objectName: <证书在KeyVault中的名称> - key: tls.key objectName: <证书在KeyVault中的名称>
2. 增加证书预处理步骤
通过initContainer统一处理挂载的证书格式,适配Elasticsearch官方镜像的要求:
initContainers: - name: cert-format image: busybox:1.36 command: ["/bin/sh", "-c"] args: - | cp /mnt/csi-cert/* /mnt/es-cert/ # 移除UTF-8 BOM头 sed -i '1s/^\xEF\xBB\xBF//' /mnt/es-cert/*.pem # 转换CRLF换行为LF sed -i 's/\r$//' /mnt/es-cert/*.pem # 补全末尾换行 sed -i -e '$a\' /mnt/es-cert/*.pem # 适配官方Elasticsearch镜像的用户UID(默认1000) chown -R 1000:1000 /mnt/es-cert volumeMounts: - name: csi-cert-volume mountPath: /mnt/csi-cert - name: es-cert-volume mountPath: /mnt/es-cert
主容器挂载es-cert-volume到/usr/share/elasticsearch/config/certs路径即可。
3. 验证方法
修改配置后可进入Pod执行以下命令验证证书格式是否正常,无报错即为格式符合要求:openssl x509 -in /usr/share/elasticsearch/config/certs/tls.crt -text -noout
内容的提问来源于stack exchange,提问作者user3023949
相关产品推荐
相关产品推荐

