【问题标题】:No prompt for client-side certificate when deploying nginx server on k8s with load balancer service使用负载均衡器服务在 k8s 上部署 nginx 服务器时不提示客户端证书
【发布时间】:2019-02-06 15:19:39
【问题描述】:

我的 Web 服务器后端强制执行客户端证书。在我将部署转移到 Kubernetes 集群之前,这非常有效。我的猜测是转发规则没有将证书请求从服务器传递到浏览器。

我正在使用uwsgi-nginx-flask-docker container

我的Nginx配置如下:

server {
    listen 8000 ssl;
    location / {
        try_files $uri @app;
    }
    location @app {
        include uwsgi_params; uwsgi_param SSL_CLIENT_S_DN $ssl_client_s_dn;

        uwsgi_pass unix:///tmp/uwsgi.sock;
        uwsgi_read_timeout 300;

        ssl_certificate     /app/cert.pem;
        ssl_certificate_key /app/key.pem;
        ssl_password_file   /app/password.pass;

        ssl_client_certificate  /app/client-ca.crt;
        ssl_verify_client off;
        ssl_verify_depth 2;
    }
    location /static {
        alias /app/static;
    }
}

在本地容器上部署此服务器时,我在flask.request.environ 中得到了SSL_CLIENT_S_DN,正如预期的那样。

在我的 Kubernetes 集群上,变量只是空的,浏览器上没有弹出证书需求。

我的服务和部署:

apiVersion: v1
kind: Service
metadata:
  name: my-server
spec:
  selector:
    app: my-server
  type: LoadBalancer
  loadBalancerIP: XX.XX.XXX.XXX
  ports:

  - protocol: TCP
    port: 8000
    targetPort: 8000

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-server
  labels:
    app: my-server
spec:
  replicas: 1
  strategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: my-server
  template:
    metadata:
      labels:
        app: my-server
    spec:
      restartPolicy: Always
      hostname: my-server
      containers:

      - name: my-server
        image: asia.gcr.io/my-project/my-server:latest
        imagePullPolicy: Always
        ports:
        - name: LISTEN_PORT
          value: "8000 ssl"

【问题讨论】:

标签: nginx kubernetes client-certificates kubernetes-service


【解决方案1】:

Kubernetes 支持multiple means of authentication,它们是:X509Static Token FileBootstrap TokensStatic Password FileService Account TokensOpenID Connect Tokens

Here 是指向 Frederic Branczyk 的博客文章的链接,Frederic Branczyk 解释了如何设置 X509 客户端证书。

他创建了一个ClusterRole,对所有 pod 和命名空间具有只读权限:

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: read-only-user
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - namespaces
  verbs:
  - get
  - list
  - watch

然后在ClusterRoleBinding中授予用户这些权限

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: read-only-users
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: read-only-user
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: brancz

上述ClusterRoleBinding 为名为“brancz”的用户提供了ClusterRole 中指定的角色,称为“只读用户”

您还可以查看他用于生成客户端证书的自动化脚本,使用集群的 CA 对其进行签名并生成 kubeconfig

希望对你有帮助。

【讨论】:

  • 似乎没有任何 Kubernetes 级别的解决方案可以让我按照我的意愿将证书 DN 传递给我的应用程序 (uwsgi_param SSL_CLIENT_S_DN $ssl_client_s_dn)
【解决方案2】:

我以为我有同样的问题,结果这只是我的 ca.crt 中的一个错误 我猜是错误的复制粘贴,检查以确保您的客户端证书的签名者位于 ca.crt 链中,如果它不是 nginx 将静默失败。

【讨论】:

    猜你喜欢
    • 2015-04-06
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 2018-06-07
    相关资源
    最近更新 更多