以下是我的Kubernetes配置。当客户端禁用SSL验证或使用HTTP而不是HTTPS时,使用此配置部署的API将按预期工作。但在启用时,它抛出SSL Error: Unable to verify the first certificate
。SSL证书文件被添加为Kubernetes secret, API在端口8080上公开。
---
apiVersion: "v1"
kind: "ConfigMap"
metadata:
name: "test-config"
namespace: "default"
labels:
app: "test"
data:
ENV: "DEV"
---
apiVersion: "apps/v1"
kind: "Deployment"
metadata:
name: "test"
namespace: "default"
labels:
app: "test"
spec:
replicas: 1
selector:
matchLabels:
app: "test"
template:
metadata:
labels:
app: "test"
spec:
containers:
- name: "test"
image: "gcr.io/test-project/test:latest"
env:
- name: "ENV"
valueFrom:
configMapKeyRef:
key: "ENV"
name: "test-config"
---
apiVersion: "extensions/v1beta1"
kind: "Ingress"
metadata:
name: "test-ingress"
annotations:
kubernetes.io/ingress.global-static-ip-name: "test-static-ip"
labels:
app: "test"
spec:
tls:
- hosts:
- "test.myhost.com"
secretName: "test-ssl-certificate"
backend:
serviceName: "test-service-nodeport"
servicePort: 8080
rules:
- host: "test.myhost.com"
http:
paths:
- path: "/*"
backend:
serviceName: "test-service-nodeport"
servicePort: 8080
---
kind: "Service"
apiVersion: "v1"
metadata:
name: "test-service-nodeport"
spec:
selector:
app: "test"
ports:
- protocol: "TCP"
port: 8080
targetPort: 8080
type: "NodePort"
Go服务器代码
http.HandleFunc("/hello", HelloServer)
err := http.ListenAndServeTLS(":8080", "server.crt", "server.key", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
出现这种情况的潜在原因可能是服务器上没有正确安装中间证书,从而导致证书链崩溃。即使它在您的浏览器中工作,它也可能不包括链中所有的公共证书,以便缓存空的客户端进行验证。以下是一些初步的故障排除步骤:
验证您的证书链是否完整[https://certificatechain]。io/]
验证服务器配置[https://www.ssllabs.com/ssltest/或https://www.sslshopper.com/ssl-checker.html]
查找这个错误:此服务器的证书链不完整。
还有这个:链问题……不完整的
如果你遇到这些问题,这意味着你正在连接的web服务器配置错误,并且在它发送给你的证书链中忽略了中间证书。您的服务器不仅需要为您的域提供证书,还需要为中间证书提供服务。
中间证书应与服务器证书一起安装在服务器上。根证书嵌入到软件应用程序、浏览器和操作系统中。提供证书的应用程序必须发送完整的链,这意味着服务器证书本身和所有中间产品。
参考stack post,将服务器证书和中间证书组合成一个链式证书获取信息。