问候,
我正在尝试使用 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"
我的客户端配置如下:
任何人都可以指点我一个解决方案吗?
谢谢你
我刚刚发现这个问题。
aws 负载均衡器通过此标头 X-Amzn-Mtls-Clientcert 传递证书,但 keycloak 无法识别该标头。
这意味着尽管流量已加密并且证书全部正确,但 keycloak 不知道哪个证书正在加密流量,并且无法与信任存储进行比较。
这是 AWS 和 keycloak 的限制,因为无法更新标头。
干杯