Azure 容器应用程序 - 如何使客户端证书可用

问题描述 投票:0回答:1

我通过 Azure 容器应用程序公开端点(仅端口 8080)。 我首先需要执行的第一步是验证 http 请求客户端证书。

我有以下可以在本地运行的代码:

 // Attempt to get the certificate from the connection
 var clientCertificate = httpContext.Connection?.ClientCertificate;
 if (clientCertificate != null)
     return clientCertificate;

 // Check if the X-ARR-ClientCert header is present
 if (httpContext.Request.Headers.TryGetValue("X-ARR-ClientCert", out var certHeader) && !string.IsNullOrWhiteSpace(certHeader))
 {
     try
     {
         byte[] certBytes = Convert.FromBase64String(certHeader!);
         clientCertificate = new X509Certificate2(certBytes);

         return clientCertificate;
     }
     catch (Exception ex)
     {
         logger.LogError(ex, "Unable to parse certificate from header 'X-ARR-ClientCert'.");
     }
 }

本地运行时

httpContext.Connection?.ClientCertificate
就足够了。在应用程序服务上
httpContext.Request.Headers.TryGetValue("X-ARR-ClientCert", out var certHeader)
就足够了。

我已经按照this并将值设置为“接受”。

我的 ACA 位于 vnet 内部,起初我以为可能是网关或其他东西正在删除证书,但当我尝试直接端点(从 vnet 内部)时,我遇到了完全相同的问题。

有什么想法吗?我是否缺少一些配置?

.net client-certificates azure-container-apps
1个回答
0
投票

如果您需要在 Azure 容器应用上设置 mTLS,一种有效的方法是使用 NGINX 作为反向代理

您需要三种类型的证书:CA 证书、服务器证书和客户端证书。

enter image description here

enter image description here

现在,创建一个 NGINX 配置文件(例如 nginx.conf)

events {}

http {
    server {
        listen 8080 ssl;

        ssl_certificate /etc/nginx/certs/server.crt;
        ssl_certificate_key /etc/nginx/certs/server.key;
        ssl_client_certificate /etc/nginx/certs/ca.crt;
        ssl_verify_client on;

        location / {
            proxy_pass http://127.0.0.1:8081;
        }
    }
}

配置准备就绪后,为 NGINX 服务器和 FastAPI 应用程序创建 Dockerfiles

对于 nginx

FROM nginx:stable
COPY nginx.conf /etc/nginx/nginx.conf
COPY server.crt /etc/nginx/certs/server.crt
COPY server.key /etc/nginx/certs/server.key
COPY ca.crt /etc/nginx/certs/ca.crt

对于fastapi

FROM python:3.10-slim

RUN pip install fastapi uvicorn

COPY app.py /app/app.py
WORKDIR /app

EXPOSE 8081

CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8081"]

现在构建这些镜像,将它们推送到您的 acr,然后将它们部署到容器应用程序上

az containerapp create \
  --name nginx-mtls-proxy \
  --resource-group your-resource-group \
  --environment your-environment \
  --image your-acr-name.azurecr.io/nginx-mtls:latest \
  --target-port 8080 \
  --ingress external \
  --registry-server your-acr-name.azurecr.io \
  --registry-identity system

对 fastapi 重复相同的方式

enter image description here

enter image description here

完成。这应该使用 mTLS 保护您的应用程序。这里,nginx 反向代理在请求到达您的应用程序之前验证客户端证书。

© www.soinside.com 2019 - 2024. All rights reserved.