GKE环境下Bitnami Nginx配置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/tlsSecret要求证书和私钥必须是PEM编码且无密码) - 证书与私钥不配对
验证步骤:
解码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 -验证证书与私钥是否配对:
# 提取证书公钥 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

