我如何debugging/修复我的Apache的SSL设置?

目标:build立一个服务器,可以接收来自域的https和http请求,并转发到在服务器上运行的rails应用程序。 rails应用程序在localhost:3002上运行,所有连接到服务器的尝试都是从互联网上的另一台机器上进行的。

我遵循这个指南: http : //hints.macworld.com/article.php?story=20041129143420344

这是我的虚拟主机定义

NameVirtualHost *:80 <VirtualHost *:80> DocumentRoot "/Users/me/projects/myproject/public" ServerName ssl.mydomain.com ServerAlias *.ssl.mydomain.com ProxyPass / http://localhost:3002/ # the rails app forwards all http requests to https </VirtualHost> <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/ ProxyPreserveHost on </VirtualHost> 

而当我尝试连接到sevre viov的网页浏览器,我得到这个错误:

 [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 () 

我该如何debugging/解决这个问题?

编辑:网页浏览器错误:(此错误发生在远程机器上(相对于服务器))

我input的url是https://ssl.mydomain.com 在这里输入图像说明

编辑2:铁轨抛出我的错误:

 Filter chain halted as [:ensure_proper_protocol] rendered_or_redirected. Completed in 0ms (DB: 0) | 302 Found [http://ssl.devtinderbox.com/] [2012-02-03 10:20:45] ERROR bad Request-Line `?p\001\003\001\000W\000\000\000\020\000\0009\000\0008\000\0005\000\000\026\000\000\023\000\000'. 

不知道这是否是重要的,因为我认为在握手知道该怎么做之前SSL握手需要成功。

我正在使用Mac OS X Lion。

您正在将端口80(清除http)和443(encryption的https)转发到相同的端口3002.这是行不通的。

我完全不了解您的configuration,但是SSL握手中的错误解释了正在发生的事情。 从这个错误我可以告诉你正在build立一个明文连接(http)到https(端口443),这将明显失败。

如果您尝试访问诸如http:// server:443 /之类的URL,并且此https端口443已打开,则会出现类似的错误。

(只是复制我自己的答案从重复的SO 。)

不要打扰您的前端和后端服务器之间的HTTPS从本地主机到本地主机。

编辑 :澄清,使用ProxyPass / http://localhost:3002/而不是ProxyPass / https://localhost:3002/


或者,如果您确实想要使用SSL连接您的反向代理服务器到后端服务器(当服务器不在Apache Httpd反向代理服务器上时,这个服务器通常很有用),除了https://backend-server-address ,请使用SSLProxy*指令来设置CA证书,如mod_proxy文档的介绍中所述 。

我从来没有见过用于此的ProxyPass; 如果有人连接到http,为什么不使用.htaccess规则强制redirect到https?

像这样(如果你没有其他的htaccess规则):

 RewriteEngine On RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://www.example.com/$1 [R,L] 

你是否说过使用rails? 如果应用程序已经有.htaccess文件,则需要根据现有规则对其进行修改。 如果你发布当前的.htaccess文件,我们可以看看。