Keycloak 信任库使用 mTLS 进行身份验证时出现问题

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

描述

问候,

我正在尝试使用 mTLS (x509) 身份验证对客户端 (myclient_mTLS) 进行身份验证,但收到 401 未经授权。

我正在 AWS 上的 EC2 实例上部署 keycloak,该实例由启用了 SSL 直通的应用程序负载均衡器提供服务。

这是我的服务器配置:

sudo docker run -d \
  --name keycloak-prod \
  -v /certificates:/certificates \
  -v /certificates:/opt/keycloak/conf/truststores \
  --network=host \
  -e KC_PROXY=edge \
  -e KEYCLOAK_ADMIN=pass \
  -e KEYCLOAK_ADMIN_PASSWORD=pass \
  -e PROXY_ADDRESS_FORWARDING=true \
  quay.io/keycloak/keycloak:25.0.4 \
  start \
  --features=token-exchange \
  --tls-hostname-verifier=ANY \
  --https-client-auth=request \
  --https-certificate-file=/certificates/subdomain_body.pem \
  --https-certificate-key-file=/certificates/key.pem \
  --hostname=<domain> \
  --https-port=8443 \
  --proxy-headers=xforwarded \
  --db=postgres \
  --db-url=jdbc:postgresql://<domain>:5432/postgres \
  --db-username=pass \
  --db-password=pass \
  --cache=ispn \
  --health-enabled=true

在这个文件夹“/opt/keycloak/conf/truststores”中,我放置了我使用的每个证书,即根证书、域证书和我想用来验证自己身份的证书。

当我执行此命令时:

curl -X POST "https://internal-keycloak-926077843.eu-central-1.elb.amazonaws.com/realms/master/protocol/openid-connect/token" \
    --cert /certificates/fredflinstone-crt.pem \
    --key /certificates/fredflinstone-key.pem \
    --cacert /certificates/rootCA-crt.pem \
    -d "client_id=myclient_mTLS" \
    -d "grant_type=client_credentials" \
    -H "Content-Type: application/x-www-form-urlencoded" \
    -v 

我总是收到未经授权的 401。 fredflinstone 和 rootCA 证书都在我上面提到的信任库中。

Keycloak 错误消息:

2024-08-28 09:53:52,916 ERROR [org.keycloak.services] (executor-thread-4) KC-SERVICES0017: Unknown result status
2024-08-28 09:53:52,917 WARN  [org.keycloak.events] (executor-thread-4) type="CLIENT_LOGIN_ERROR", realmId="f4d40c0e-b423-4307-9f2c-e102285e4f42", realmName="master", clientId="myclient_mTLS", userId="null", ipAddress="10.33.21.157", error="invalid_client_credentials", grant_type="client_credentials"

我的客户端配置如下:

enter image description here

任何人都可以指点我一个解决方案吗?

谢谢你

keycloak x509 truststore mtls
1个回答
0
投票

我刚刚发现这个问题。

aws 负载均衡器通过此标头 X-Amzn-Mtls-Clientcert 传递证书,但 keycloak 无法识别该标头。

这意味着尽管流量已加密并且证书全部正确,但 keycloak 不知道哪个证书正在加密流量,并且无法与信任存储进行比较。

这是 AWS 和 keycloak 的限制,因为无法更新标头。

干杯

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