使用SSL进行代理

45

我有一个运行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 Internal Server Error错误信息。查看错误日志:

[Wed Jul 20 08:35:34 2011] [error] [client 76.168.166.70] SSL Proxy请求www.wileybits.com:80,但未启用[提示:SSLProxyEngine] [Wed Jul 20 08:35:34 2011] [error] proxy:HTTPS:未能为74.166.186.70:443(win.acme.com)启用ssl支持

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

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

提前感谢 - ekkis

p.s. 主机名和地址已更改以保护隐私 :)

* 更新 *

使用:

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

看起来它能正常工作,但是当然,Windows的主机名会变得可见,这在我的情况下是不可接受的。

我也尝试过(而不是使用mod_rewrite):

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

但是出现了相同的错误


为什么我因这个得了一个负分? - ekkis
2个回答

86

我搞清楚了... 显然我可以这样做:

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

它完全正常工作!

[解决方案来自于3cx.org上mikeg的文章]


11
对于后来发现此问题的人:我的问题在于没有包括 SSLProxyEngine on。请注意,它不能在 .htaccess 文件中使用。 - robbrit
2
您还需要运行 sudo a2enmod headers proxy ssl cache 命令,并添加 SSLEngine on(否则会出现错误 [error] Oops, no RSA or DSA server certificate found for 'www.somedomain.com:0'?!),以及使用相同的密钥和证书设置SSLCertificateFile/SSLCertificateKeyFile。 - bumpmann
8
对于其他可能感到困惑的人:Front-End-Https是微软应用程序的专有标志,在代理到其他服务时不需要设置。 - Andrew Mao
我相信现在应该是CacheDisable/。 - Larry K

0

不确定这个错误的原因,但您可能想尝试使用Squid或Varnish来完成此操作。之前,我曾经使用Squid代理一个安全的Windows IIS实例而没有任何问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接