我通过 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 内部)时,我遇到了完全相同的问题。
有什么想法吗?我是否缺少一些配置?
如果您需要在 Azure 容器应用上设置 mTLS,一种有效的方法是使用 NGINX 作为反向代理。
您需要三种类型的证书:CA 证书、服务器证书和客户端证书。
现在,创建一个 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 重复相同的方式
完成。这应该使用 mTLS 保护您的应用程序。这里,nginx 反向代理在请求到达您的应用程序之前验证客户端证书。