XAMPP多站点SSL配置:本地虚拟主机独立HTTPS证书

作者:技术拾光

时间:2026-06-18

浏览:597

在Apache中为多个虚拟主机配置独立HTTPS证书需启用SNI技术,并为每个站点完整配置SSLEngine、证书及私钥路径。证书的CommonName必须与ServerName一致。也可通过不同端口区分站点,注意路径使用正斜杠。同时需修改hosts文件并处理浏览器缓存问题。

文章目录

在Apache上配置多个HTTPS域名时,不少运维人员会遇到一个典型问题:手动修改证书路径后,只有一个域名能正常访问,其他域名报错ERR_SSL_PROTOCOL_ERROR。这背后的原因很简单——Apache在同一IP和端口上,默认不会根据域名来切换证书。

XAMPP多站点SSL配置:本地虚拟主机独立HTTPS证书

Apache会直接加载第一个匹配的配置及其证书,然后对所有后续HTTPS请求都使用同一套证书。如果请求的域名与证书不匹配,SSL握手就会失败。要解决这个问题,必须启用SNI(Server Name Indication)技术,并为每一个独立配置完整的SSL指令。

为什么只有第一个VirtualHost生效了

Apache默认在同一端口(如*:443)上不支持“按域名动态切换证书”。这个功能必须依赖SNI,且需要客户端的支持。XAMPP默认配置中,既没有显式开启SNI,也没有在每个站点中完整配置SSL参数。因此,你可能遇到:访问https://a.test正常,但https://b.test白屏或报错。

排查步骤如下:

  • 确认模块已加载: 检查httpd.conf中LoadModule ssl_module modules/mod_ssl.so和Include conf/extra/httpd-ssl.conf这两行是否已被注释。它们必须处于激活状态。
  • 清理默认VirtualHost: 在httpd-ssl.conf中,若存在一个“万能”的配置,它会“霸占”所有443端口的请求。需将其删除或注释。
  • 为每个站点配齐参数: 每个独立的HTTPS 中,必须完整配置以下三个核心指令:
    SSLEngine on
    SSLCertificateFile "你的证书路径"
    SSLCertificateKeyFile "你的私钥路径"
  • 证书与域名绑死: 自签名证书生成时,Common Name必须与ServerName完全一致,否则浏览器会报NET::ERR_CERT_COMMON_NAME_INVALID。

更稳妥的办法:用不同端口来区分站点

如果觉得SNI配置和兼容性测试较繁琐,可以采用更直接的方案:为每个站点分配独立HTTPS端口,如4433、4443、4453。尤其在Windows环境下,系统服务常抢占443端口,改端口往往能快速解决问题。

具体操作:

  • 添加监听端口: 在httpd.conf顶部添加所需端口号,如Listen 4433和Listen 4443。这行代码不能写在httpd-ssl.conf中。
  • 配置独立的VirtualHost: 在httpd-ssl.conf文件底部,追加两个独立配置块,端口号与Listen指令严格对应。例如:
    
      DocumentRoot "D:/xampp/htdocs/site-a"
      ServerName a.test
      SSLEngine on
      SSLCertificateFile "conf/ssl.crt/a.test.crt"
      SSLCertificateKeyFile "conf/ssl.key/a.test.key"
    
    另一站点同理,只需更换端口号、网站根目录和ServerName。
  • 注意路径格式: 证书路径中,必须使用正斜杠/或双反斜杠\\。单反斜杠\会作为转义字符导致路径错误。
  • 彻底重启: 修改配置后,必须完全停止Apache服务,再启动。仅执行“重新加载”操作,SSL模块状态可能不会被刷新。

证书路径与格式的那些坑

Apache对证书文件要求严格,路径、格式和权限都必须正确,否则启动失败或握手中断。错误日志中常见SSL Library Error: error:02001003:system library:fopen:No such process或error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch。

以下细节可节省调试时间:

  • 使用自带的openssl: 必须使用XAMPP自带的openssl.exe(位于\apache\bin\)生成证书,否则可能产生不兼容的PEM编码。
  • 私钥不要加密: 生成私钥时务必加上-nodes参数(不加密),否则Apache启动时需手动输入密码,无法自动启动。
  • 路径是相对conf目录的: 配置中的SSLCertificateFile "conf/ssl.crt/a.test.crt",实际指向\apache\conf\ssl.crt\a.test.crt。
  • 手动创建并授权: 目录ssl.crt和ssl.key需手动在conf\目录下创建,Apache不会自动生成。创建后,还需在Windows“安全”属性中,为SYSTEM用户添加“读取”权限。

hosts与浏览器的小问题

即使Apache配置完全正确,仍可能无法访问。问题通常出在本机DNS解析或浏览器缓存上。

  • 修改hosts文件: 需在C:\Windows\System32\drivers\etc\hosts文件中手动添加域名映射:127.0.0.1 a.test和127.0.0.1 b.test。仅依靠localhost无法生效。
  • 处理自签名证书警告: 首次访问自签名证书站点时,Chrome会拦截并提示“您的连接不是私密连接”。点击“高级”,然后选择“继续前往a.test(不安全)”。之后浏览器会记住该例外。
  • 清除HSTS缓存: 浏览器可能强制将HTTP升级至HTTPS导致访问失败。可打开chrome://net-internals/#hsts,在“Delete domain security policies”中输入待测试域名,清除HSTS缓存。
  • 处理混合内容: 若项目代码中硬编码了http://的资源链接(如JS文件或API地址),HTTPS页面会因“混合内容”被浏览器拦截。需将所有资源链接改为https://或相对协议//。

配置Apache多站点HTTPS时,最拖慢进度的往往是证书路径是否真实存在、Listen与端口号是否完全一致,以及Windows后台占用443端口的svchost.exe进程。把这些细节理清后,剩余步骤就只是水到渠成的事了。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›