使用SSL代理

ekkis 42 mod-rewrite apache2 virtualhost mod-proxy ssl-certificate

我有一台运行Apache的Linux主机和一台运行IIS的Windows主机.我有一个指向Linux主机的域,需要将其中继(代理)请求发送到IIS; 因此我在Apache中有以下虚拟主机定义(工作正常):

<VirtualHost 192.168.0.2:80>
    ServerName www.acme.com
    DocumentRoot /var/www/acme.com

    RewriteEngine On
    RewriteOptions Inherit
    RewriteRule ^/(.*) http://win.acme.com/$1 [P]
</VirtualHost>

现在我想添加SSL支持; 定义变为:

<VirtualHost 192.168.0.2:443>
    ServerName www.acme.com
    DocumentRoot /var/www/acme.com
    GnuTLSEnable On
    GnuTLSPriorities NORMAL:%COMPAT
    GnuTLSCertificateFile /var/www/ssl/www.acme.com.crt
    GnuTLSKeyFile /var/www/ssl/www.acme.com.key

    RewriteEngine On
    RewriteOptions Inherit
    RewriteRule ^/(.*) https://win.acme.com/$1 [P]
</VirtualHost>

我在两个Web服务器上都有有效且可信的证书,如果我访问https://win.acme.com一切都很好,但是,当我访问时,https://www.acme.com我收到500内部服务器错误消息.查看错误日志显示:

[Wed Jul 20 08:35:34 2011] [错误] [客户端76.168.166.70] SSL代理请求www.wileybits.com:80但未启用[提示:SSLProxyEngine] [Wed Jul 20 08:35:34 2011] [error] proxy:HTTPS:无法为74.166.186.70:443启用ssl支持(win.acme.com)

请注意代理请求似乎是针对错误的域(wileybits)...它显示的域也由我的Apache服务器托管,但我不知道为什么它出现在acme.com的日志中(反向也许是DNS查找?)

无论如何,我错过了什么?

提前谢谢 - ekkis

ps主机名和地址已被修改,以保护无辜:)

*更新*

有:

RewriteRule ^/(.*) https://win.acme.com/$1 [R,L]

它似乎工作正常,但当然,Windows的主机名变得可见,这在我的场景中是不可接受的

我也试过(而不是mod_rewrite):

ProxyRequests Off
ProxyPass / https://win.acme.com/

但同样的错误

ekkis.. 82

想通了......显然我可以这样做:

SSLProxyEngine On
RequestHeader set Front-End-Https "On"
ProxyPass / https://win.acme.com/
ProxyPassReverse / https://win.acme.com/
CacheDisable *

它工作得很好!

[解决方案来自mikeg在3cx.org上的帖子]

  • 对于那些后来发现的人:我的问题不包括`SSLProxyEngine on`.请注意,它不能位于`.htaccess`文件中. (9认同)
  • 对于那些看到这个并且可能感到困惑的人:`Front-End-Https`是[Microsoft应用程序的专有标志](http://en.wikipedia.org/wiki/List_of_HTTP_header_fields),不需要设置代理其他服务时. (8认同)
  • 你还需要`sudo a2enmod headers proxy ssl cache`并添加SSLEngine(否则我得到一个错误`[错误]哎呀,没有找到'www.somedomain.com:0'的RSA或DSA服务器证书?!!)和SSLCertificateFile/SSLCertificateKeyFile具有相同的密钥和证书 (2认同)