【发布时间】: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