首页 > 解决方案 > 需要帮助在 WSL2 上设置 HTTPS

问题描述

我真的需要一些帮助来配置 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 错误。

谢谢你的帮助!

标签: apachesslhttpswsl-2mkcert

解决方案


为了回答您的问题,新安装的 Apache 通常附带 10 年 SSL 自签名证书 (snakeoil)。这就是您的浏览器已经检测到 SSL 证书的原因。

以下配置代码中详细说明了预安装的自签名证书。

SSLCertificateFile  /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

推荐阅读