【发布时间】:2021-11-11 00:42:29
【问题描述】:
我真的需要一些帮助来配置 WSL 以在本地 Apache 站点上使用 HTTPS。我花了 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 错误。
感谢您的帮助!
【问题讨论】:
标签: apache ssl https wsl-2 mkcert