Apache的ssl_module未启用是HTTPS访问失败的主因,需取消httpd.conf中LoadModule ssl_module和Include httpd-ssl.conf两行注释,并用XAMPP自带openssl生成匹配路径的证书,同时导入系统根证书库。

确认 Apache 的 ssl_module 是否已启用
直接访问 https://localhost 失败,或跳转到 XAMPP 控制面板首页,大概率是模块根本没加载。打开 XAMPP\apache\conf\httpd.conf,检查两行是否取消注释:
LoadModule ssl_module modules/mod_ssl.soInclude conf/extra/httpd-ssl.conf
只开 mod_ssl.so 而不启用 httpd-ssl.conf,Apache 启动不会报错,但 HTTPS 请求会被静默丢弃——这是“配了却打不开”的头号原因。
用 XAMPP 自带 openssl 生成自签名证书
别装第三方 OpenSSL,也别用网上抄来的脚本。XAMPP 8.0+ 自带 openssl.exe(路径:C:\xampp\apache\bin\openssl.exe),它生成的 PEM 格式与 Apache 兼容性最好。在管理员权限 CMD 中执行:
cd C:\xampp\apache\bin openssl req -x509 -nodes -days 365 -newkey rsa:2048 ^ -keyout C:\xampp\apache\conf\ssl.key\server.key ^ -out C:\xampp\apache\conf\ssl.crt\server.crt
注意三点:
-
-nodes必须加,否则 Apache 启动时会卡在密码输入环节 - 输出路径必须严格匹配
httpd-ssl.conf中的SSLCertificateFile和SSLCertificateKeyFile配置(默认就是"conf/ssl.crt/server.crt"和"conf/ssl.key/server.key") - 填
Common Name时,写你实际访问的域名(如localhost或myapp.test),浏览器会校验这个字段
为本地域名配置带 SAN 的证书(非 localhost 场景)
如果要用 dev.example.local 这类自定义域名,仅靠上面命令生成的证书会触发浏览器“不安全”警告——因为现代浏览器强制校验 Subject Alternative Name (SAN),而默认 req 命令不写入 SAN。
解决方法:手写一个 openssl.cnf 文件(放在 C:\xampp\apache\bin\ 下),内容包含 [alt_names] 段落,例如:
[req] distinguished_name = req_distinguished_name x509_extensions = v3_req prompt = no [req_distinguished_name] C = CN ST = Beijing L = Beijing O = DevTeam CN = dev.example.local [v3_req] subjectAltName = @alt_names [alt_names] DNS.1 = dev.example.local DNS.2 = www.dev.example.local IP.1 = 127.0.0.1
然后运行:
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 ^ -config dev.example.local.cnf ^ -keyout dev.example.local.key ^ -out dev.example.local.crt
再把这两个文件放进 conf/ssl.key/ 和 conf/ssl.crt/,并在 httpd-ssl.conf 的 中引用它们。
强制 HTTP 跳转 HTTPS 并绕过浏览器警告
配置完 SSL 不等于用户自动走 HTTPS。要在 httpd-ssl.conf 对应的 块里加重定向规则(确保 mod_rewrite 已启用):
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
但更关键的是:浏览器对自签名证书的警告无法靠服务端配置消除。你必须手动将生成的 server.crt(或 dev.example.local.crt)导入系统“受信任的根证书颁发机构”存储区。Windows 上双击证书 → “安装证书” → 选择“本地计算机” → 放入“受信任的根证书颁发机构”。这一步漏掉,每次点“高级→继续前往”都是白费劲。
最后提醒一句:证书里的 Common Name 和 SAN、Apache 配置中的 ServerName、hosts 文件里的映射、浏览器实际访问的地址——这四者必须完全一致,差一个字符都会触发证书错误。不是配置越复杂越可靠,而是每处都得对得上。











