nginx - 使用负载均衡器服务在 k8s 上部署 nginx 服务器时不提示客户端证书
问题描述
我的 Web 服务器后端强制执行客户端证书。在我将部署转移到 Kubernetes 集群之前,这非常有效。我的猜测是转发规则没有将证书请求从服务器传递到浏览器。
我正在使用uwsgi-nginx-flask-docker 容器。
我的 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;
}
}
SSL_CLIENT_S_DN
在本地容器上部署此服务器时,我flask.request.environ
按预期进入。
在我的 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"
解决方案
Kubernetes 支持多种身份验证方式,它们是:X509、静态令牌文件、引导令牌、静态密码文件、服务帐户令牌和OpenID 连接令牌。
这是Frederic Branczyk的博客文章的链接,他解释了如何设置 X509 客户端证书。
他为所有 pod 和命名空间创建了一个ClusterRole
只读权限:
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
名为“read-only-user”中指定的角色</p>
您还可以查看他用于生成客户端证书的自动化脚本,使用集群的 CA 对其进行签名并生成kubeconfig
.
我希望这可以帮助你。
推荐阅读
- azure-iot-hub - IoT 中心消息负载 - 如何定义应用程序属性和正文?
- linux - 如何根据 USB 的 vid 和 pid 找到网络接口名称
- matlab - 如何将某个簇大小以上的“开”像素簇更改为“关”像素
- c++ - C++ 应用程序:将值从表单传递到主窗口私有变量
- django-rest-framework - 如何在 django web 上显示图像?
- javascript - 带有子对象的Javascript递归JSON数组
- algorithm - 确定以下代码的运行时间(内部循环递归)
- android - Cordova - Android - 获取位置时的通知和图标
- go - Golang 无法将 XML 映射到 Struct
- python - 如何减少协方差函数的输出时间