WSL2 Apache本地站点HTTPS配置及自定义域名访问故障求助
我需要为WSL中运行的Apache本地站点配置HTTPS访问,目前已尝试两天仍未解决,参考了多篇公开同类教程仍未解决。
已完成的前置操作:
- 已在Windows和WSL2中均安装了mkcert
- 先在管理员权限的PowerShell中执行以下命令,在
C:\Users\YOUR_WINDOWS_USERNAME\AppData\Local\mkcert路径下生成证书:
mkcert -install mkcert localhost 127.0.0.1 ::1 0.0.0.0
操作执行成功,对应目录下可看到生成的证书文件。
- 在PowerShell中执行以下命令时失败:
setx CAROOT "$(mkcert -CAROOT)"; If ($Env:WSLENV -notlike "*CAROOT*") { setx WSLENV "CAROOT/up:$Env:WSLENV" }
因此改为在WSL终端中执行如下命令配置环境变量:
echo 'export CAROOT=/mnt/c/Users/YOUR_WINDOWS_USERNAME/AppData/Local/mkcert' >> ~/.profile
以此让WSL端的mkcert使用Windows侧生成的证书,配置生效,执行mkcert -CAROOT命令可返回正确路径:
/mnt/c/Users/YOUR_WINDOWS_USERNAME/AppData/Local/mkcert
问题1 默认SSL配置修改后访问异常
未修改default-ssl.conf的前提下,https://localhost已可访问(需手动确认接受证书风险),当前default-ssl.conf内容如下:
<IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> </VirtualHost> </IfModule>
此时可正常加载Apache默认页面,但将DocumentRoot修改为Windows侧的站点文件存储路径后:
DocumentRoot /mnt/c/YOUR_WINDOWS_USERNAME/dev/www/example.com/public_html
访问https://localhost提示“Connection failed: No such file or directory”,已确认对应目录下存在index.php和index.html文件。
即便同步修改证书和密钥路径为正确的mkcert生成文件路径也无效果:
SSLCertificateFile /mnt/c/Users/YOUR_WINDOWS_USERNAME/AppData/Local/mkcert/localhost+3.pem SSLCertificateKeyFile /mnt/c/Users/YOUR_WINDOWS_USERNAME/AppData/Local/mkcert/localhost+3-key.pem
重启Apache无报错,可确认路径填写正确、目录真实存在。
核心需求未实现:自定义域名HTTPS访问
目标是实现https://example.com的HTTPS访问,已做操作如下:
- 已执行命令生成对应域名的证书,确认文件已生成:
mkcert example.com
- Windows的Hosts文件已配置如下映射:
127.0.0.1 example.com 127.0.0.1 www.example.com
- 已启用
example.com.conf配置:
<VirtualHost *:80> ServerName example.com ServerAlias www.example.com ServerAdmin webmaster@localhost DocumentRoot /mnt/c/Users/YOUR_WINDOWS_USERNAME/dev/www/example.com/public_html ErrorLog /mnt/c/Users/YOUR_WINDOWS_USERNAME/dev/www/example.com/logs/error.log CustomLog /mnt/c/Users/YOUR_WINDOWS_USERNAME/dev/www/example.com/logs/access.log combined <Directory /mnt/c/Users/YOUR_WINDOWS_USERNAME/dev/www/example.com/public_html> Require all granted </Directory> </VirtualHost>
- 已启用
example.com.ssl.conf配置:
<IfModule mod_ssl.c> <Directory /mnt/c/Users/YOUR_WINDOWS_USERNAME/dev/www/example.com/public_html> Require all granted DirectoryIndex index.php index.html </Directory> <VirtualHost example.com:443> SSLEngine on SSLCertificateFile /mnt/c/Users/YOUR_WINDOWS_USERNAME/AppData/Local/mkcert/example.com.pem SSLCertificateKeyFile /mnt/c/Users/YOUR_WINDOWS_USERNAME/AppData/Local/mkcert/example.com-key.pem ServerName example.com ServerAlias www.example.com ServerAdmin webmaster@localhost DocumentRoot /mnt/c/Users/YOUR_WINDOWS_USERNAME/dev/www/example.com/public_html ErrorLog /mnt/c/Users/YOUR_WINDOWS_USERNAME/dev/www/example.com/logs/error.log CustomLog /mnt/c/Users/YOUR_WINDOWS_USERNAME/dev/www/example.com/logs/access.log combined <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> </VirtualHost> </IfModule>
此时在浏览器访问example.com或https://example.com,Chrome提示“无法访问此网站 / ERR_CONNECTION_REFUSED”,Firefox提示“无法连接”。
注:路径中的YOUR_WINDOWS_USERNAME为占位符,实际配置时已替换为正确的Windows用户名。
问题更新
已将Hosts文件修改为如下内容:
127.0.0.1 example.com 127.0.0.1 www.example.com ::1 example.com ::1 www.example.com
同时将所有站点相关路径修改为WSL侧的路径:
DocumentRoot /home/LINUX_USERNAME/dev/www/example.com/public_html
修改后可加载Apache2/Ubuntu默认页面,但无法加载public_html目录下的index.php文件内容,访问https://example.com/index.php返回404 Not Found错误。
1. 基础配置修正
首先确认Apache必要模块已启用,在WSL终端执行命令:
sudo a2enmod ssl rewrite sudo systemctl restart apache2
同时修正SSL虚拟主机的监听配置,将example.com.ssl.conf中的<VirtualHost example.com:443>改为<VirtualHost *:443>,避免域名绑定解析异常。
2. 404问题排查
- 确认WSL侧站点目录的权限正确,执行命令:
sudo chown -R www-data:www-data /home/LINUX_USERNAME/dev/www/example.com/public_html sudo chmod -R 755 /home/LINUX_USERNAME/dev/www
- 检查是否有默认虚拟主机优先级高于自定义站点,执行命令查看已启用的虚拟主机列表:
sudo a2query -s
如果000-default.conf或default-ssl.conf排在前面,可选择禁用默认配置:
sudo a2dissite 000-default.conf default-ssl.conf sudo systemctl restart apache2
- 查看Apache错误日志定位具体原因:
sudo tail -f /var/log/apache2/error.log
3. 证书信任问题解决
把mkcert生成的根证书导入到Windows的受信任根证书颁发机构路径下,避免浏览器提示证书风险:在WSL中找到rootCA.pem文件(路径为$CAROOT/rootCA.pem),双击在Windows中打开,按提示导入到「受信任的根证书颁发机构」存储区即可。
4. 端口映射排查
如果仍出现连接拒绝问题,确认WSL2的443端口已正常监听,执行命令:
sudo netstat -tulpn | grep apache2
确认输出中存在443端口的监听记录即可。
内容的提问来源于stack exchange,提问作者Joe

