Apache添加HTTPS代理:
2. 安装必要的组件和启用Apache代理模块,运行命令
sudo apt install apache2 python3 certbot python3-certbot-apache
sudo a2enmod proxy proxy_http proxy_connect ssl
3. 新建或修改站点的Apache VHOST配置文件,例如 /etc/apache2/sites-available/www.abc.com.conf,添加下面的:
- ProxyRequests On
- ProxyVia Full
- <Proxy *>
- Order deny,allow
- Allow from all
- </Proxy>
例如:
- <VirtualHost *:80>
- ServerName www.abc.com ServerAdmin webmaster@localhost
- DocumentRoot /var/www/html
- ProxyRequests On
- ProxyVia Full
- <Proxy *>
- Order deny,allow
- Allow from all
- </Proxy>
- ErrorLog ${APACHE_LOG_DIR}/error.log
- CustomLog ${APACHE_LOG_DIR}/access.log combined
- </VirtualHost>
4. 启用站点,并重启 Apache:
sudo a2ensite www.abc.com
sudo service apache restart
5. 获取HTTPS证书:
此时会显示菜单提示你安装,按提示操作即可,如果DNS A记录配置正确,会自动生成对应的 https 的vhost配置 www.abc.com-le-ssl.conf,并且会让你选择是否自动重定向http为https,根据需要选择即可。/etc/apache2/sites-enabled/www.abc.com-le-ssl.conf示例如下
- <IfModule mod_ssl.c>
- <VirtualHost *:443>
- ServerName www.abc.com
- ServerAdmin webmaster@localhost
- DocumentRoot /var/www/html
- ErrorLog ${APACHE_LOG_DIR}/error.log
- CustomLog ${APACHE_LOG_DIR}/access.log combined
- Include /etc/letsencrypt/options-ssl-apache.conf
- SSLProxyEngine on
- SSLCertificateFile /etc/letsencrypt/live/www.abc.com/fullchain.pem
- SSLCertificateKeyFile /etc/letsencrypt/live/www.abc.com/privkey.pem
- ProxyRequests On
- ProxyVia Full
- <Proxy *>
- Order deny,allow
- Allow from all
- </Proxy>
- </VirtualHost>
如果运行 certbot 提示错误:
Certbot doesn't know how to automatically configure the web server on this system
则说明python3-certbot-apache没有正确安装,你可以试试重新安装看看,也可以只获取证书,然后手动配置 www.abc.com-le-ssl.conf 如上:
sudo certbot --certonly
完成后,重启 apache 就可以了。
在浏览器中,用 https://www.abc.com 试试访问你的网站是否正常可以访问。
疑难解答
Apache开启https代理后,客户端通过代理上网,发现Apache日志(/var/log/apache2/error.log)出现下面的错误:
AH02032: Hostname xxx.com provided via SNI and hostname www.xxx.com provided via HTTP have no compatible SSL setup
说明站点SNI存在问题,在站点的默认的default-ssl.conf中,添加配置如下:
如果是虚拟主机,那么需要把你的服务器的默认站点的HTTPS的证书改为你的https网站的证书,简单来说,就是你在浏览器里面用
https://你服务器的IP地址 ,打开后,用浏览器查看https证书,这个证书就是你的服务器的默认https证书,你必须把你的域名的证书覆盖到默认证书上去。
如果客户端浏览器无法正常上网,Apache错误日志中出现 "CONNECT www.google.com:443 HTTP/1.1" 405 ,可能是代理服务器没有开启mod proxy并正确加载。修改 /etc/apache2/apache2.conf文件,查看是否有以下行的配置:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
如果还是不能解决,那么就把下面的代码,写入 默认站点的000-default.conf 配置当中
- ProxyRequests On
- ProxyVia Full
- AllowCONNECT 443
- <Proxy *>
- Allow from all
- Require all granted
-
- </Proxy>
如果要实现安全配置,只允许特定IP进行代理访问,可以用Require ip ip地址限定,参考上面的例子。
若需要用户名和密码验证才能使用代理,可以增加以下配置:
- <Proxy *>
- Order deny,allow
- Allow from all
- Require valid-user
- AuthType Basic
- AuthName "Restricted Content"
- AuthUserFile /etc/apache2/passwords
- SSLRequireSSL
- <RequireAny>
- Require valid-user
- </RequireAny>
- </Proxy>
其中 /etc/apache2/passwords 文件,由以下指令生成:
sudo htpasswd -c /etc/apache2/passwords username
如果追加用户,请去掉 -c 选项。