You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GKE环境下Bitnami Nginx配置Jenkins HTTPS访问报错排查

问题:GKE上Jenkins HTTPS访问证书错误排查

我在GKE上配置Jenkins:Jenkins部署在devops-tools命名空间,Nginx部署在kube-system命名空间,希望通过私有域名以HTTPS方式访问Jenkins。

使用的工具版本

  • Helm: version.BuildInfo{Version:"v3.13.0", GitCommit:"825e86f6a7a38cef1112bfa606e4127a706749b1", GitTreeState:"clean", GoVersion:"go1.20.8"}
  • Kubernetes:
    Client Version: v1.28.2
    Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
    Server Version: v1.27.3-gke.100
    
  • Jenkins Chart版本:jenkins-4.8.2

Jenkins Helm配置(部分values)

httpsKeyStore:
  jenkinsHttpsJksSecretName: ''
  jenkinsHttpsJksSecretKey: "jenkins-jks-file"
  jenkinsHttpsJksPasswordSecretName: ""
  jenkinsHttpsJksPasswordSecretKey: "https-jks-password"
  enable: true
  httpPort: 8081
  path: "/var/lib/jenkins"
  fileName: "keystore.jks"
  password: "some password"
  jenkinsKeyStoreBase64Encoded: | 
     /u3+7QAAAAIAAAA...

ingress:
  enabled: true
  apiVersion: "networking.k8s.io/v1"
  ingressClassName: nginx
  hostName: "jenkins.devops-tools-k8s-cluster.internal.com"
  tls:
  - secretName: jenkins-tls-secret
    hosts:
      - jenkins.devops-tools-k8s-cluster.internal.com

TLS Secret配置

apiVersion: v1
kind: Secret
metadata:
  name: jenkins-tls-secret
  namespace: devops-tools
data:
  tls.crt: base64 crt
  tls.key: base64 key
type: kubernetes.io/tls

Nginx日志信息

I1108 09:05:56.567114       1 store.go:585] "Secret was added and it is used in ingress annotations. Parsing" secret="devops-tools/jenkins-tls-secret"
I1108 09:05:56.568214       1 backend_ssl.go:67] "Adding secret to local store" name="devops-tools/jenkins-tls-secret"

访问错误信息

访问https://jenkins.devops-tools-k8s-cluster.internal.com时出现以下错误:

2023/11/08 09:42:57 [error] 32#32: *128412 [lua] certificate.lua:263: call(): failed to set DER private key: d2i_PrivateKey_bio() failed, context: ssl_certificate_by_lua*, client: 172.38.0.1, server: 0.0.0.0:443

环境说明:使用Bitnami Nginx最新稳定版,尝试过其他版本问题依旧;证书为GCP私有域名的自签名证书;Jenkins通过端口转发可正常访问。

疑问

哪里配置错误?是否是Bitnami Nginx的问题?


排查与解决方案

1. 优先验证证书与私钥格式及有效性

错误提示d2i_PrivateKey_bio() failed核心原因是Nginx无法解析私钥,常见触发场景:

  • 私钥不是无密码的PEM格式(Kubernetes的kubernetes.io/tls Secret要求证书和私钥必须是PEM编码且无密码)
  • 证书与私钥不配对

验证步骤:

  1. 解码Secret中的私钥并检查格式:

    kubectl get secret jenkins-tls-secret -n devops-tools -o jsonpath='{.data.tls\.key}' | base64 -d > jenkins.key
    openssl rsa -in jenkins.key -check
    

    如果提示输入密码,说明私钥带密码保护,需去除密码后重新生成Secret:

    openssl rsa -in jenkins.key -out jenkins-nopass.key
    kubectl create secret tls jenkins-tls-secret -n devops-tools --cert=jenkins.crt --key=jenkins-nopass.key --dry-run=client -o yaml | kubectl apply -f -
    
  2. 验证证书与私钥是否配对:

    # 提取证书公钥
    openssl x509 -in jenkins.crt -noout -pubkey > cert.pub
    # 提取私钥公钥
    openssl rsa -in jenkins.key -pubout > key.pub
    # 对比内容,无输出则说明配对正常
    diff cert.pub key.pub
    

2. 修正Jenkins与Ingress的HTTPS冲突

你同时启用了Jenkins自身的HTTPS(httpsKeyStore.enable: true)和Ingress的HTTPS,会导致双重SSL终止,增加配置复杂度。建议二选一:

方案A:关闭Jenkins自身HTTPS,由Ingress统一处理SSL

修改Jenkins Helm values:

httpsKeyStore:
  enable: false

确保Ingress后端指向Jenkins的默认HTTP端口(8080),Ingress负责SSL终止,后端用HTTP通信,配置更简洁稳定。

方案B:保留Jenkins自身HTTPS,配置Ingress透传HTTPS流量

需在Ingress添加注解,同时确保Nginx Controller启用SSL透传功能:

ingress:
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"

注意:Bitnami Nginx Ingress默认未开启ssl-passthrough,需要修改Controller的启动参数,添加--enable-ssl-passthrough。

3. Bitnami Nginx的额外检查

Bitnami版本的Nginx Ingress与官方版本兼容,但需确认:

  • 已启用Lua脚本支持(错误日志显示ssl_certificate_by_lua,说明已启用,无需额外配置)
  • Controller具备读取devops-tools命名空间Secret的权限(现有日志显示已成功读取,权限问题可排除)

总结

先排查证书和私钥的格式、配对问题,这是当前错误的最可能原因;再调整Jenkins与Ingress的HTTPS配置逻辑,避免双重SSL终止。

内容的提问来源于stack exchange,提问作者Roxbip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 15:24:52