问题描述
我已经按照本教程 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
客户相关的点很少。希望这可以帮助您通过替代方法解决该问题。