WSO2 API Manager 4.0.0 Key Manager 与 Keycloak 的集成不起作用

问题描述

我已经按照本教程 https://apim.docs.wso2.com/en/latest/administer/key-managers/configure-keycloak-connector/ 将 Keycloak 作为密钥管理器与 WSO2 API Manager 4.0.0 集成,一切都按照描述完成,但是当我尝试获取 client_credentials access_token 时,WSO2 http 客户端出现错误 - Keycloak交流,查看与假装有关的痕迹。错误是这样的:

Caused by: feign.RetryableException: Hostname localhost not verified:
    certificate: sha256/7mHCBc7ms9yqA/gz+nIRA9cUTRqrEgK3j9eX9fmpDZ0=
    DN: CN=localhost
    subjectAltNames: [] executing POST https://localhost:8443/auth/realms/master/clients-registrations/openid-connect

正如错误跟踪中所描述的,它是一个主机名验证,因为主机名是 localhost。为了绕过这个,我将主机名验证设置为禁用,但它仍在发生。我不知道如何跳过此验证。这些是我的配置文件片段:

deployment.toml

[transport.passthru_https]
sender.hostname_verifier = "AllowAll"

[transport.passthru_https.sender.parameters]
HostnameVerifier = "AllowAll"

[transport.passthru_http]
sender.hostname_verifier = "AllowAll"

api-manager.bat

set CMD_LINE_ARGS=%CMD_LINE_ARGS% -Djava.endorsed.dirs=%JAVA_ENDORSED% -Dorg.opensaml.httpclient.https.disableHostnameVerification=true -Dhttpclient.hostnameVerifier="AllowAll" 

在 WSO2 安装中的 client-truststore.jks 中也导入了这个 localhost 证书。

知道如何跳过此主机名验证吗?

解决方法

WSO2 API 管理器使用 Feign OKHTTP 客户端与 Keycloak 服务器进行通信。 OKHTTP 客户端需要具有与 SAN 相同的 CN 条目的公共证书。

Keycloak 的默认公共证书不包含任何 SAN 值。因此,在尝试与 Keycloak 通信时,Feign 客户端开始抛出 SSL 异常。为了解决这个问题,您可以按照此 documentation 为 Keycloak 创建一个新的密钥库,并将该证书导入 API 管理器的 client-truststore.jks。提到的 keytool 命令使用 SAN 条目生成密钥库和证书。

给定的是来自 API Manager Docs 的相同 Keytool 命令。

keytool -genkey -alias server -keyalg RSA -keysize 2048 -validity 3650 -keystore application.keystore -dname "CN=localhost,OU=Support,O=WSO2,L=Colombo,S=Western,C=LK" -storepass password -keypass password -noprompt -ext SAN=dns:localhost

此外,上述 hostname_verifier 配置不适用于禁用 OKHTTP 客户端中的主机名验证。

这不是您所面临行为的绝对解决方案,但您可以使用这种替代方法(为 Keycloak 生成新的密钥库)来克服它。

here 收集到的与 OKHTTP 客户相关的点很少。希望这可以帮助您通过替代方法解决该问题。