【问题标题】:HTTPS access through Apache proxy: no valid certification path通过 Apache 代理进行 HTTPS 访问:没有有效的证书路径
【发布时间】:2017-02-12 19:19:48
【问题描述】:

我正在尝试使用前端 Apache(版本 2.4.6)服务器作为 ReverseProxy 来配置 SSL 访问,以使用 glassfish(版本 3.1.2.2)为部署在后端服务器上的多个 Java 应用程序提供服务。 使用 virtualHost 和 ServerName,HTTP 协议一切正常:

<VirtualHost *:80>
   ServerName ppd-cas.capeb.fr
   # redirect "/" "https://ppd-cas.capeb.fr/cas"
   ProxyPreserveHost On
   RedirectMatch "/$" "/cas"
   ProxyPass "/cas" "http://10.1.93.10:34674/cas" retry=0 timeout=300 Keepalive=On
   ProxyPassReverse "/cas" "http://10.1.93.10:34674/cas"
</VirtualHost>

我将 HTTPS(在 ssl.conf 中)配置如下:

<VirtualHost *:443>
   ServerName ppd-cas.capeb.fr

   SSLEngine on
   SSLProxyEngine on
   SSLProxyVerify none
   SSLProxyCheckPeerCN off
   SSLProxyCheckPeerName off
   # SSLProxyCheckPeerExpire off
   SSLCertificateFile /etc/ssl/private/server.cert
   SSLCertificateKeyFile /etc/ssl/private/server.key

   ProxyRequests Off
   ProxyPreserveHost on
   RedirectMatch "/$" "/cas"
   ProxyPass "/cas" "https://10.1.93.10:56912/cas" retry=0 timeout=300 Keepalive=On
   ProxyPassReverse "/cas" "https://10.1.93.10:56912/cas"
</VirtualHost>

证书是自签名的,在前端服务器上生成和部署。我想我可以在浏览器和前端之间使用 HTTPS,然后忽略前端和后端之间的证书,因此上述选项带有“none”或“off”参数。

提供的示例 (ppd-cas.capeb.fr) 使用 https 可以正常工作,但是下面描述的另一个应用程序具有相同的参数,但不能:

<VirtualHost *:443>
   ServerName ppd-isabat.capeb.fr

   SSLEngine on
   SSLProxyEngine on
   SSLProxyVerify none
   SSLProxyCheckPeerCN off
   SSLProxyCheckPeerName off
   # SSLProxyCheckPeerExpire off
   SSLCertificateFile /etc/ssl/private/server.cert
   SSLCertificateKeyFile /etc/ssl/private/server.key

   ProxyRequests Off
   ProxyPreserveHost on
   RedirectMatch "/$" "/CAPEBWeb"
   ProxyPass "/CAPEBWeb" "https://10.1.93.10:8181/CAPEBWeb" retry=0 timeout=300 Keepalive=On
   ProxyPassReverse "/CAPEBWeb" "https://10.1.93.10:8181/CAPEBWeb"
</VirtualHost>

我在 Glassfish 日志中得到的错误是:

[#|2016-10-04T15:54:46.078+0200|WARNING|glassfish3.1.2|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=19;_ThreadName=Thread-2;|StandardWrapperValve[action]: PWC1406: Servlet.service() for servlet action threw exception
java.lang.RuntimeException: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

棘手的部分是应用程序ppd-isabat.capeb.fr(不起作用的那个)部署在Glassfish的domain1上并使用CAS身份验证,而CAS(起作用的那个)部署在domain2上相同的玻璃鱼。尝试访问 ppd-isabat.capeb.fr (https://ppd-isabat.capeb.fr),我被正确重定向到 CAS 的身份验证页面,验证凭据后发生错误。对我来说,不同的安装域是问题的一部分,但这只是一种预感。

我的方法(禁用前端和后端之间的 SSL 约束)是否错误?我错过了一些明显的东西吗? Glassfish 已嵌入自签名证书,因此他应该能够识别自己的身份?

我彻底搜索了 StackOverflow,但没有一个问题真正符合这种奇特的配置。

任何帮助表示赞赏:)

PS:这是我的第一篇文章,所以请不要太苛刻。我是法国人,所以请不要太苛刻!

【问题讨论】:

    标签: java apache https glassfish


    【解决方案1】:

    您在帖子中说您想在 Apache 本身终止 SSL,并且 Apache 和 Glassfish 之间的通信应该是 HTTP(non-ssl) 但您正在使用 @987654324 将请求传递到后端@网址:

    ProxyPass "/CAPEBWeb" "**https**://10.1.93.10:8181/CAPEBWeb" retry=0 timeout=300 Keepalive=On
    ProxyPassReverse "/CAPEBWeb" "**https**://10.1.93.10:8181/CAPEBWeb"
    

    您不应该使用 http:// 而不是 https:// 吗? 根据 glassfish 的配置,您可能还需要将端口从 8181 更改为其他端口。

    【讨论】:

    • 我尝试将其设置为 Apache 和 Glassfish 之间的 HTTP,但没有成功。因此,我将 Apache 配置为使用 HTTPS,但使用以下方法忽略证书:SSLProxyVerify none、SSLProxyCheckPeerCN off 和 SSLProxyCheckPeerName off。 8181 是 Glassfish 中侦听 domain1 的 HTTPS 流量的端口。
    • 更准确地说,在 Apache 中结束 https 会导致以下错误:ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径。似乎 CAS 对我当前的配置不满意。
    猜你喜欢
    • 1970-01-01
    • 2015-03-28
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    相关资源
    最近更新 更多