我有两个 AWS EC2 实例,一个 Web 服务器和一个应用服务器。我的主页位于我的 Web 服务器上。在使用 SSL 之前,我可以使用以下方式从我的主页访问应用服务器上的页面:
http://homePage.com/app1/page.php
我的 proxy-host.conf 包含以下内容
<virtualhost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
ProxyPreserveHost On
# Servers to proxy the connection, or
# List of application servers Usage
ProxyPass /app1/ http://10.0.1.22:80/
# ProxyPass /app1/ http://10.0.1.22:443/
</virtualhost>
我已经更改了 /etc/apache2/ports.conf 和 /etc/apache2/httpd.conf,因此我的主页始终使用端口 443 的 SSL。我创建了一个包含以下内容的 proxy-ssl-host.conf 文件。
<virtualHost *:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine On
# Set the path to SSL certificate
# Usage: SSLCertificateFile /path/to/cert.pem
SSLCertificateFile /etc/apache2/ssl/homepage.com.crt
SSLCertificateKeyFile /etc/apache2/ssl/homepage.com.key
ProxyPreserveHost On
ProxyPass /app1/ https://10.0.1.22:443/
ProxyPassReverse /app1/ https://10.0.1.22:443/
ServerName localhost
</VirtualHost>
在创建 proxy-ssl-host.conf 后,我输入了以下内容
sudo a2ensite proxy-ssl-host.conf
sudo service apache2 reload
sudo systemctl restart apache2.service
现在,当我进入浏览器并输入
https://homePage.com/app1/page.php
我明白了
The requested URL /app1/page.php was not found on this server.
Apache/2.4.18 (Ubuntu) Server at homePage.com Port 443
编辑1:
我试过
sudo netstat -ntpl | grep :443
在应用服务器上,没有得到任何结果,因此 Apache 没有监听该服务器上的端口 443。我添加了
Listen 443
后
Listen 80
在 ports.conf 中,现在获取
tcp6 0 0 :::443 :::* LISTEN 2205/apache2
后
sudo netstat -ntpl | grep :443
不幸的是,这并没有解决我在浏览器上遇到的任何问题。
编辑2:
当我进入网络服务器并输入
wget https://10.0.1.22/page.php
我有
--2018-02-18 20:58:32-- https://10.0.1.22/page.php
Connecting to 10.0.1.22:443... connected.
OpenSSL: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
Unable to establish SSL connection.
当我进入
wget https://10.0.1.22/app1/page.php
我有
--2018-02-18 20:59:37-- https://10.0.1.22/app1/page.php
Connecting to 10.0.1.22:443... connected.
OpenSSL: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
Unable to establish SSL connection.
当我进入
wget http://10.0.1.22
我有
--2018-02-18 19:32:45-- http://10.0.1.22/
Connecting to 10.0.1.22:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4198 (4.1K) [text/html]
Saving to: ‘index.html’
index.html 100%[=====================================================================================>] 4.10K --.-KB/s in 0s
2018-02-18 19:32:45 (564 MB/s) - ‘index.html’ saved [4198/4198]
当我在地下室的 DMZ 上设置 SSL 时,我只需要在我的 Web 服务器上安装 SSL 证书,它们也会在我的应用服务器上生效。但是,在我的地下室,它们具有相同的公共 IP 地址。此外,Web 服务器运行 CentOS,而应用服务器运行 Debian。在我的云 DMZ 中,它们具有不同的 IP 地址,并且都在 Ubuntu 上运行。我想知道这是否需要在我的应用服务器上设置证书,就像我在 Web 服务器上设置证书一样。
答案1
由于您使用标准端口,因此您可以从代理配置中省略:443
和。:80
我将使用的第一个测试是验证是否可以从您的 Web 服务器访问。通常使用或https://10.0.1.22:443/app1/page.php
工具来完成此操作。wget
curl
SSL 验证可能失败https://10.0.1.22
。您需要在10.0.1.22
必须监听 HTTPS 流量的服务器上拥有适当的证书。看来您没有重写Host
标头,因此您应该能够在后端服务器上使用来自前端服务器的证书。
如果您信任您的本地网络,您可以代理http://10.0.1.22
。这将使您的app1
流量暴露在本地网络上,从而被窥探。
答案2
我想到了。
我本应将 ProxyPass 放在块之外。这将错误更改为概述的错误这里。我使用了他们的解决方案,错误现在变成了下面列出的错误这里。我使用了他们的解决方案,完全解决了我的问题。
因此 /etc/apache2/sites-available/proxy-host.conf 变成
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
ProxyPass /app1/ https://ip-10-0-1-22/
<virtualhost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
ProxyPreserveHost On
# Servers to proxy the connection, or
# List of application servers Usage
ProxyPass /app1/ https://ip-10-0-1-22.ec2.internal/
</virtualhost>
并且 /etc/apache2/sites-available/proxy-ssl-host.conf 变成
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
ProxyPass /app1/ https://ip-10-0-1-22/
ProxyPassReverse /app1/ https://ip-10-0-1-22/
<virtualHost *:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine On
# Set the path to SSL certificate
# Usage: SSLCertificateFile /path/to/cert.pem
SSLEngine on
SSLProxyEngine On
ProxyRequests Off
SSLCertificateFile /etc/apache2/ssl/clusterprism.com.crt
SSLCertificateKeyFile /etc/apache2/ssl/clusterprism.com.key
ProxyPass /app1/ https://ip-10-0-1-22.ec2.internal/
ProxyPassReverse /app1/ https://ip-10-0-1-22.ec2.internal/
ServerName localhost
</VirtualHost>