apache - 需要帮助在 WSL2 上设置 HTTPS

标签 apache ssl https wsl-2 mkcert

我真的需要一些帮助来配置 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 位置加载文件吗?
如果我还将以下内容更改为证书和 key 的正确位置,也无济于事:
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 .
我运行以下命令来创建我的证书和 key 文件并确认它们已创建:
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我收到未找到错误。
谢谢你的帮助!

最佳答案

为了回答您的问题,新安装的 Apache 通常附带 10 年 SSL 自签名证书 (snakeoil)。这就是您的浏览器已经检测到 SSL 证书的原因。
以下配置代码中详细说明了预安装的自签名证书。

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

关于apache - 需要帮助在 WSL2 上设置 HTTPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69201361/

相关文章:

php - Apache 重写语法中 PHP 的 dirname(__FILE__) 的等价物?

c# - 当服务器具有有效的 SSL 证书时,将 WebClient.UploadFile() 与 "Handshake failed...unexpected packet format"一起使用时获取 "https"

c - 当http header错误报告content-length时该怎么办

https - 如何在nodejs中转发HTTPS流量?

apache 虚拟主机提供不正确的证书

java - Hadoop Reducer 自定义可写

apache - 如果未找到请求的图像 URL,则使用 mod_rewrite 调用默认图像 URL

windows - 运行 berks install 时出错

wordpress - SSL 找到一个不存在的文件

java - 没有换行字符的 JSON Java