我有一个基本的nginx部署和一个现有的证书,由我们通过证书管理器加密。我认为一切都已经就绪,可以开始使用证书了,但我无法连接https。
连接到LoadBalancer IP和域可以工作。使用https连接到域无法连接。Chrome表示ERR_SSL_PROTOCOL_ERROR
,Firefox表示SSL_ERROR_RX_RECORD_TOO_LONG
,SSL实验室表示Assessment failed: No secure protocols supported
。都是同一个问题。
以下是服务:
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: example
labels:
app: example
spec:
type: LoadBalancer
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
- name: https
protocol: TCP
port: 443
targetPort: 80
selector:
app: example
这是入口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx
namespace: example
annotations:
cert-manager.io/cluster-issuer: letsencrypt-production
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
tls:
- hosts:
- 'example.com'
secretName: example-production-tls
rules:
- host: example.com
http:
paths:
- path: /
backend:
serviceName: nginx
servicePort: 443
该证书填充如下:
kubectl describe secret
...
Data
====
tls.crt: 3574 bytes
tls.key: 1675 bytes
ca.crt: 0 bytes
证书资源由正确的入口拥有。我已经用上面的“示例”替换了我的域。
似乎一切都已经就绪,但我不知道为什么我无法通过https连接。我能运行什么来排除这个问题呢?
更新:我发现我的部署和nginx映像缺少一些配置。我遵循了这里的所有步骤:https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/#securing-the-service
和以前一样,我可以在443和80上连接到LoadBalancer IP,但是https连接失败了。与http合作:
curl http:// -k
Hello!
Stay tuned for launch!
https失败:
curl https:// -k
curl: (35) error:1400410B:SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number
发布于 2020-01-03 03:40:03
本例中的问题是部署和服务的结合。我使用服务yaml中的这一行将https流量路由到端口80:
- name: https
protocol: TCP
port: 443
targetPort: 80
这无法完成SSL握手,而这正是curl: (35) error:1400410B:SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number
所要做的。
我认为这是可以的,因为在以前使用SSL的服务上,我在美洲狮上路由端口80和443到3000。我不知道如果在美洲狮上路由443到80会发生什么,但是它肯定与nginx断绝了关系。更改上面的服务yaml解决了这个问题(在确保nginx监听443并在default.conf中的default.conf中启用了SSL之后):
- name: https
protocol: TCP
port: 443
targetPort: 443
https://serverfault.com/questions/997435
复制相似问题