尝试使用 Apache 对 vsphere webclient 进行反向代理

尝试使用 Apache 对 vsphere webclient 进行反向代理

我们希望使用已经存在且正在运行的 Apache 2.4 反向代理(例如集中监控、mod_security 等好处)保护我们的 VMWare vsphere 6.5 Web 客户端。

通信客户端 <--> 代理和代理 <--> 后端 (= vsphere) 都必须采用 TLS 保护。证书已到位且正常。DNS 已相应配置。

客户端已经可以通过代理成功访问 vsphere 起始页,例如 https://vsphere.domain.tld/

Firefox 的网络分析显示所有请求均正常并被接受,例如

    302 GET /vsphere-client/ [FQDN] document html

直到 /vsphere-client/UI.swf

但是,只要用户点击“vSphere Web Client (Flash)”链接进行身份验证并进入菜单,就会抛出状态代码 400。“vSphere Web Client (Flash)”链接指向 /vsphere-client/,显然会调用 SAML 请求。

    400 GET https://vsphere.domain.tld/websso/SAML2/SSO/vsphere.local?SAMLRequest=zVRba9sw[...] [FQDN] subdocument

vsphere sso 日志显示:

    tomcat-http--38 ERROR org.opensaml.common.binding.decoding.BaseSAMLMessageDecoder] SAML message intended destination endpoint 'https://vsphere-internal.domain.tld/websso/SAML2/SSO/vsphere.local' did not match the recipient endpoint 'https://vsphere.domain.tld/websso/SAML2/SSO/vsphere.local'

到目前为止,Apache 反向代理上的虚拟主机配置(摘录):

    SSLProxyEngine on
    ProxyPreserveHost on
    ProxyRequests off
    ProxyPass        / https://vsphere.domain.tld/
    ProxyPassReverse / https://vsphere.domain.tld/

    ProxyPass        /vsphere-client https://vsphere.domain.tld/vsphere-client/
    ProxyPassReverse /vsphere-client https://vsphere.domain.tld/vsphere-client/
    ProxyPass        /websso/SAML2/SSO https://vsphere.domain.tld/websso/SAML2/SSO/
    ProxyPassReverse /websso/SAML2/SSO https://vsphere.domain.tld/websso/SAML2/SSO/

    # new, to solve the name binding problem (see 1st answer)
    RequestHeader set Host "vsphere-internal.domain.tld"

通过最后的“RequestHeader”附录 - 实际上只是反转了 PreserveHost 选项 - 我现在能够看到 vsphere 登录页面并登录,但该页面再次卡住:

    tomcat-http--10 ERROR com.vmware.identity.BaseSsoController] Could not parse tenant request java.lang.IllegalStateException: org.opensaml.xml.security.SecurityException: SAML message intended destination endpoint did not match recipient endpoint

关于如何获取完整页面,有什么建议吗?

答案1

我想通过将后端主机名(= vsphere web 客户端)添加到 Apache 的 vhost conf 来解决第一个问题,即“预期的目标端点...与接收端点不匹配”:

    RequestHeader set Host "<backend hostname>"

(此处:vsphere-internal.domain.tld),但正如 ezra-s 正确解释的那样,这只是反转了 PreserveHost 选项。所以我删除了 RequestHeader 和 PreserveHost 选项。仍然遇到第二个问题...

相关内容