首页  编辑  

Apache开启HTTPS代理科学上网翻墙

Tags: /计算机文档/网络与安全/   Date Created:
Apache添加HTTPS代理:
1. 首先你要申请一个域名,想白嫖,不想出钱,可以申请一个动态域名DDNS 如 Free dynamic DNS service | Dynu Systems, Inc.。记得配置动态域名的DNS A记录为你的服务器或者VPS的IP地址。
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,添加下面的:
  1.         ProxyRequests On
  2.         ProxyVia Full
  3.         <Proxy *>
  4.                 Order deny,allow
  5.                 Allow from all
  6.         </Proxy>
例如:
  1. <VirtualHost *:80>
  2.         ServerName www.abc.com        ServerAdmin webmaster@localhost
  3.         DocumentRoot /var/www/html
  4.         ProxyRequests On
  5.         ProxyVia Full
  6.         <Proxy *>
  7.                 Order deny,allow
  8.                 Allow from all
  9.         </Proxy>
  10.         ErrorLog ${APACHE_LOG_DIR}/error.log
  11.         CustomLog ${APACHE_LOG_DIR}/access.log combined
  12. </VirtualHost>
4. 启用站点,并重启 Apache:
sudo a2ensite www.abc.com
sudo service apache restart
5. 获取HTTPS证书:
sudo certbot
此时会显示菜单提示你安装,按提示操作即可,如果DNS A记录配置正确,会自动生成对应的 https 的vhost配置 www.abc.com-le-ssl.conf,并且会让你选择是否自动重定向http为https,根据需要选择即可。/etc/apache2/sites-enabled/www.abc.com-le-ssl.conf示例如下
  1. <IfModule mod_ssl.c>
  2. <VirtualHost *:443>
  3.         ServerName www.abc.com
  4.         ServerAdmin webmaster@localhost
  5.         DocumentRoot /var/www/html
  6.         ErrorLog ${APACHE_LOG_DIR}/error.log
  7.         CustomLog ${APACHE_LOG_DIR}/access.log combined
  8.         Include /etc/letsencrypt/options-ssl-apache.conf
  9.         SSLProxyEngine on
  10.         SSLCertificateFile /etc/letsencrypt/live/www.abc.com/fullchain.pem
  11.         SSLCertificateKeyFile /etc/letsencrypt/live/www.abc.com/privkey.pem
  12.         ProxyRequests On
  13.         ProxyVia Full
  14.         <Proxy *>
  15.                 Order deny,allow
  16.                 Allow from all
  17.         </Proxy>
  18. </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 试试访问你的网站是否正常可以访问。

疑难解答
  • SNI错误
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证书,你必须把你的域名的证书覆盖到默认证书上去。
  • 405错误
如果客户端浏览器无法正常上网,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 配置当中
  1.         ProxyRequests On
  2.         ProxyVia Full
  3.         AllowCONNECT 443
  4.         <Proxy *>
  5.                 Allow from all
  6.                 Require all granted
  7.   # Require ip 1.2.3.4 只允许 IP 为 1.2.3.4 的客户端IP进行代理访问
  8.         </Proxy>
  • 安全配置(用户名和密码)
如果要实现安全配置,只允许特定IP进行代理访问,可以用Require ip ip地址限定,参考上面的例子。
若需要用户名和密码验证才能使用代理,可以增加以下配置
  1. <Proxy *>
  2.     Order deny,allow
  3.     Allow from all
  4.     Require valid-user
  5.     AuthType Basic
  6.     AuthName "Restricted Content"
  7.     AuthUserFile /etc/apache2/passwords
  8.     SSLRequireSSL
  9.     <RequireAny>
  10.         Require valid-user
  11.     </RequireAny>
  12. </Proxy>
其中 /etc/apache2/passwords 文件,由以下指令生成:
sudo htpasswd -c /etc/apache2/passwords username
如果追加用户,请去掉 -c 选项。