我真的需要一些帮助来配置 WSL 以使用 HTTPS 为本地 Apache 站点工作。我花了 2 天时间试图让它工作。我使用了以下文章作为参考(以及其他类似文章):
https://jitheshkt.medium.com/enable-ssl-on-wsl2-apache-windows-10-bcdfef71024a
https://gist.github.com/dennisameling/8317b9dc6b7d971860a4797c64f16eaf(准备 SSL 证书部分)
mkcert 安装在 Windows 和 WSL2 上
我在 Power Shell (Admin) 中运行以下命令在 C:\Users\YOUR_WINDOWS_USERNAME\AppData\Local\mkcert 中创建证书:
mkcert -install
mkcert localhost 127.0.0.1 ::1 0.0.0.0
这似乎有效,因为我可以在文件夹中看到证书。
但是,在 Power Shell 中运行时,以下内容对我不起作用:
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
但是有些事情不起作用,我绝对不理解。
例如,在完成上述操作之后,现在 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,我会得到“连接失败:没有这样的文件或目录”(为了确定,这个文件夹中有一个 index.php 和 index.html 文件)。
知道为什么它无法从该 DocumentRoot 位置加载文件吗?
如果我还将以下内容更改为证书和密钥的正确位置,也无济于事:
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。
我运行以下命令来创建我的证书和密钥文件并确认它们已创建:
mkcert example.com
我配置了我的 Windows 主机文件:
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 用户名。
** 更新 **
将主机文件更改为:
127.0.0.1 example.com
127.0.0.1 www.example.com
::1 example.com
::1 www.example.com
并将 DocumentRoot(和所有其他文件路径)更改为 WSL 方面的位置:
DocumentRoot /home/LINUX_USERNAME/dev/www/example.com/public_html
已允许加载 Apache2/Ubuntu 默认页面。但它没有加载 public_html 文件夹中 index.php 文件的实际内容。如果我查看https://example.com/index.php,我会收到 Not Found 错误。
谢谢你的帮助!