我遵循了以下指南: http://hints.macworld.com/article.php?story=20041129143420344
这是我的虚拟主机定义
<VirtualHost *:443>
SSLEngine on
SSLProxyEngine On
RequestHeader set Front-End-Https "On"
CacheDisable *
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
DocumentRoot "/Users/me/projects/myproject/public"
ServerName ssl.mydomain.com
ServerAlias *.ssl.mydomain.com
SSLCertificateKeyFile "/private/etc/apache2/certs/webserver.nopass.key"
SSLCertificateFile "/private/etc/apache2/certs/newcert.pem"
SSLCACertificateFile "/private/etc/apache2/certs/demoCA/cacert.pem"
SSLCARevocationPath "/private/etc/apache2/certs/demoCA/crl"
ErrorLog "/Users/me/Desktop/ssl.log"
ProxyPass / https://localhost:3002/
ProxyPassReverse / https://localhost:3002
ProxyPreserveHost on
</VirtualHost>
当我尝试通过 Web 浏览器连接到服务器时,出现以下错误:
[Thu Feb 02 16:50:40 2012] [error] (502)Unknown error: 502: proxy: pass request body failed to 127.0.0.1:3002 (localhost)
[Thu Feb 02 16:50:40 2012] [error] [client 96.11.81.39] proxy: Error during SSL Handshake with remote server returned by /session/new
[Thu Feb 02 16:50:40 2012] [error] proxy: pass request body failed to 127.0.0.1:3002 (localhost) from 96.11.81.39 ()
我该如何调试/修复这个问题?
答案1
补充 vbartoni 的回答,似乎从 Apache 2.4 及更高版本开始,有不同的默认值和一个新的指令。
我正在运行 Apache 2.4.6,并且必须添加以下指令才能使其运行:
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
答案2
我遇到了类似的问题(相同的错误日志),只是代理将 https 流量转发到另一台主机。
由于我很懒,而且主机位于我自己的隔离网络中,因此这些指令解决了该问题:
SSLProxyVerify none
SSLProxyCheckPeerCN off
答案3
不要在前端和后端服务器之间担心 HTTPS,为连接启用 SSL 没有什么意义localhost
。
为了澄清起见,使用ProxyPass / http://localhost:3002/
而不是ProxyPass / https://localhost:3002/
或者,如果您确实希望使用 SSL 将反向代理连接到后端服务器(当该服务器不在 Apache Httpd 反向代理所在位置时非常有用),除了 之外https://backend-server-address
,还可以使用SSLProxy*
指令来设置 CA 证书,如中所述mod_proxy
文档介绍。特别是,您需要配置SSLProxyCACertificateFile
并确保后端服务器的证书颁发给正确的主机名Apache Httpd 所见(即localhost
你的情况)。
如果您没有使用 SSL 连接到后端服务器,它可能无法检测到您实际上正在使用 SSL,并配置为强制您使用 SSL(因此无限重定向)。您可能希望查看与以下类似的机制:Jetty 有自己的forwarded
选择(以便能够告诉后端它位于代理后面)。X-Forwarded-Proto
默认情况下,Rails 可能能够解释。在这种情况下,将其添加到您的 Apache 配置中(在 SSL 虚拟主机中):
RequestHeader set X-Forwarded-Proto 'https'
似乎有类似的问题被讨论过这里, 例如。
答案4
如果后端服务器使用过时的自签名证书,则需要再增加一个选项(如果无法访问后端服务器):
SSLProxyCheckPeerExpire 关闭